創建型設計模模式---建造者模式
創建型設計模模式---建造者模式
設計模式
序號 | 內容 | 鏈接地址 |
---|---|---|
1 | 設計模式七大原則 | https://blog.csdn.net/qq_39668819/article/details/115390615 |
2 | 創建型設計模式–工廠模式 | https://blog.csdn.net/qq_39668819/article/details/115375928 |
3 | 創建型設計模式–抽象工廠模式 | https://blog.csdn.net/qq_39668819/article/details/115390992 |
4 | 創建型設計模式–單例模式 | https://blog.csdn.net/qq_39668819/article/details/115396191 |
5 | 創建型設計模式–建造者模式 | https://blog.csdn.net/qq_39668819/article/details/115396212 |
6 | 創建型設計模式—原型模式 | https://blog.csdn.net/qq_39668819/article/details/115396227 |
7 | 結構型設計模式—代理模式 | https://blog.csdn.net/qq_39668819/article/details/115480346 |
8 | 結構型設計模式—適配器模式 | https://blog.csdn.net/qq_39668819/article/details/115499090 |
9 | 結構型設計模式—橋接模式 | https://blog.csdn.net/qq_39668819/article/details/115560823 |
10 | 結構型設計模式—裝飾模式 | https://blog.csdn.net/qq_39668819/article/details/115582291 |
11 | 結構型設計模式—外觀模式 | https://blog.csdn.net/qq_39668819/article/details/115643900 |
12 | 結構型設計模式—享元模式 | https://blog.csdn.net/qq_39668819/article/details/115680930 |
13 | 結構型設計模式—組合模式 | https://blog.csdn.net/qq_39668819/article/details/115720713 |
14 | 行為型設計模式—模板方法模式 | https://blog.csdn.net/qq_39668819/article/details/115774426 |
15 | 行為型設計模式—策略模式 | https://blog.csdn.net/qq_39668819/article/details/115804292 |
16 | 行為型設計模式—命令模式 | https://blog.csdn.net/qq_39668819/article/details/115877361 |
17 | 行為型設計模式—責任鏈模式 | https://blog.csdn.net/qq_39668819/article/details/115981287 |
18 | 行為型設計模式—狀態模式 | https://blog.csdn.net/qq_39668819/article/details/116077215 |
19 | 行為型設計模式—觀察者模式 | https://blog.csdn.net/qq_39668819/article/details/116141223 |
20 | 行為型設計模式—中介者模式 | https://blog.csdn.net/qq_39668819/article/details/116177694 |
21 | 行為型設計模式—迭代器模式 | https://blog.csdn.net/qq_39668819/article/details/116213033 |
22 | 行為型設計模式—訪問者模式 | https://blog.csdn.net/qq_39668819/article/details/116246907 |
23 | 行為型設計模式—備忘錄模式 | https://blog.csdn.net/qq_39668819/article/details/116333844 |
24 | 行為型設計模式—解釋器模式 | https://blog.csdn.net/qq_39668819/article/details/116379466 |
建造者模式
模式的定義與特點
建造者(Builder)模式的定義:指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式。它是將一個復雜的對象分解為多個簡單的對象,然后一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
生活中這樣的例子很多,如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;每封電子郵件的發件人、收件人、主題、內容、附件等內容也各不相同。
該模式的主要優點如下:
-
封裝性好,構建和表示分離。
-
擴展性好,各個具體的建造者相互獨立,有利于系統的解耦。
-
客戶端不必知道產品內部組成的細節,建造者可以對創建過程逐步細化,而不對其它模塊產生任何影響,便于控制細節風險。
其缺點如下:
- 產品的組成部分必須相同,這限制了其使用范圍。
- 如果產品的內部變化復雜,如果產品內部發生變化,則建造者也要同步修改,后期維護成本較大。
建造者(Builder)模式和工廠模式的關注點不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創建過程,但兩者可以結合使用。
模式的結構
建造者(Builder)模式的主要角色如下:
- 產品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創建其各個零部件。
- 抽象建造者(Builder):它是一個包含創建產品各個子部件的抽象方法的接口,通常還包含一個返回復雜產品的方法。
- 具體建造者(Concrete Builder):實現 Builder 接口,完成復雜產品的各個部件的具體創建方法。
- 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成復雜對象的創建,在指揮者中不涉及具體產品的信息。
模式的實現
這里以游戲中的英雄為例來介紹建造者模式
產品角色:
Hero
,包含了游戲角色的基本屬性,如:模型、皮膚、技能組、基礎屬性。抽象建造者:
HeroBuilder
,聲明了游戲角色各個屬性的構建的抽象方法。具體建造者:
CatalinaBuilder
、YassoBuilder
實現了指定角色的屬性的構建,提供了各個屬性的構建方法。指揮者:
HeroDirector
提供一個構建具體游戲角色的方法,以具體構建者為參數。
/**
* 引入了 lombok
*/
@Getter
@Setter
@ToString
public class Hero {/*** 角色模型*/private String model;/*** 角色皮膚*/private String skin;/*** 角色技能組*/private String[] skills;/*** 角色基礎屬性*/private Map<String, String> basicProperties;}
public class Catalina extends Hero {public Catalina() {System.out.println("開始構建卡特琳娜");}
}
public class Yasso extends Hero {public Yasso() {System.out.println("開始構建亞索");}
}
抽象建造者 (Builder):包含創建產品各個子部件的抽象方法。
public interface HeroBuilder {/*** 構建模型*/void buildModel();/*** 構建皮膚*/void buildSkin();/*** 構建技能*/void buildSkills();/*** 構建基礎屬性*/void buildBasicProperties();/*** 構建英雄* @return*/Hero buildHero();
}
具體建造者:實現了抽象建造者接口。
public class CatalinaBuilder implements HeroBuilder {private Hero catalina;public CatalinaBuilder() {this.catalina = new Catalina();}@Overridepublic void buildModel() {catalina.setModel("源計劃:雄心");}@Overridepublic void buildSkin() {catalina.setSkin("源計劃:雄心");}@Overridepublic void buildSkills() {catalina.setSkills(new String[]{"貪婪【被動】", "彈射之刃", "伺機待發", "瞬步", "死亡蓮華"});}@Overridepublic void buildBasicProperties() {Map<String, String> basic = new HashMap<>();basic.put("攻擊力", "58(每級成長傷害+3.2)");basic.put("生命值", "602(每級成長生命值+94)");basic.put("法力值", "60(康夫是一個無耗藍的英雄,估計該數值只是默認值)");basic.put("移動速度", "340");basic.put("護甲", "28(每級成長護甲+3.5)");basic.put("魔抗", "32(每級成長魔抗+1.2)");basic.put("每5秒回血", "7.5+0.7");basic.put("每5秒回藍", "20");basic.put("范圍", "125");catalina.setBasicProperties(basic);}@Overridepublic Hero buildHero() {return catalina;}
}
public class YassoBuilder implements HeroBuilder {private Hero yasso;public YassoBuilder() {this.yasso = new Yasso();}@Overridepublic void buildModel() {yasso.setModel("靈魂蓮華模型");}@Overridepublic void buildSkin() {yasso.setSkin("靈魂蓮華皮膚");}@Overridepublic void buildSkills() {yasso.setSkills(new String[]{"浪客之道【被動】", "斬鋼閃", "風之障壁", "踏前斬", "狂風絕息斬"});}@Overridepublic void buildBasicProperties() {Map<String, String> basic = new HashMap<>();basic.put("攻擊力", "51.6(每級成長傷害+3.6)");basic.put("生命值", "512(每級成長生命值+82)");basic.put("法力值", "60(yasoo是一個無耗藍的英雄,估計該數值只是默認值)");basic.put("移動速度", "350");basic.put("護甲", "18.4(每級成長護甲+3.4)");basic.put("魔抗", "30");basic.put("每5秒回血", "5");basic.put("每5秒回藍", "0");basic.put("范圍", "175");yasso.setBasicProperties(basic);}@Overridepublic Hero buildHero() {return yasso;}
}
指揮者:調用建造者中的方法完成復雜對象的創建。
public class HeroDirector {/*** 構建英雄* @param roleBuilder 建造者* @return*/public Hero constructHero(HeroBuilder roleBuilder) {roleBuilder.buildModel();roleBuilder.buildSkin();roleBuilder.buildSkills();roleBuilder.buildBasicProperties();return roleBuilder.buildHero();}
}
測試
public class BuilderTest {public static void main(String[] args) {HeroDirector roleDirector = new HeroDirector();Hero catalina = roleDirector.constructHero(new CatalinaBuilder());Hero yasso = roleDirector.constructHero(new YassoBuilder());System.out.println(catalina);System.out.println(yasso);}
}
適用場景
建造者模式主要適用于以下應用場景:
- 如果你需要創建的各種形式的產品, 它們的制造過程相似且僅有細節上的差異, 此時可使用建造者模式。
- 建造者模式讓你能分步驟構造產品,并且你可以延遲執行某些步驟而不會影響最終產品, 你甚至可以遞歸調用這些步驟;如果有以上需求可以使用建造者模式。