建造者模式

hello world.png
《目錄》:

未命名文件.png
UML類圖:

未命名文件 (2).png
介紹:
1、將一個復(fù)雜對象的構(gòu)建與它表示分離,使得童謠的構(gòu)建過程可以創(chuàng)建不同的表示
2、主要作用
1、 用戶只需要給出指定復(fù)雜對象的類型和內(nèi)容;
2、建造者模式負(fù)責(zé)按順序創(chuàng)建復(fù)雜對象(把內(nèi)部的建造過程和細(xì)節(jié)都隱藏起來)
3、解決的問題
- 方便用戶創(chuàng)建復(fù)雜的對象(不需要知道實(shí)現(xiàn)過程)
- 代碼的復(fù)用性&封裝性(將對象構(gòu)建過程和細(xì)節(jié)進(jìn)行封裝&復(fù)用)
實(shí)例
接下來我們用一個例子來說明以上給大家講解的問題和內(nèi)容
相信大家很多人都玩過《魔獸世界3 冰封王座》,不知道大家記不記得《建房子模式》,我們可以選擇建房造小兵,英雄,然后帶著大部隊(duì)干掉對面。
分析分析:
1、背景: 我們開始建造房子,小兵,英雄,攻打?qū)γ?
2、過程:
1、我們(client)開始 和 游戲模式(Diretor)溝通 尋找 建造的需求
2、了解需求后,我們把我們需要的小兵和英雄以及房子分為各個部件(Builder)的請求(金幣 、 木材 、 時間)
3、指揮建房子的農(nóng)民(ConcreateBuilder) 去構(gòu)建組件
4、將組件組長成游戲模式需要的,開始建造 成功建造為房子(Product)
開始步驟
- 步驟一
public abstract class Builder {
// 第一步 : 挖礦 得金幣
// 聲明為抽象方法,具體由子類事項(xiàng)
public abstract void GetGold();
// 第二步: 砍樹
// 聲明為抽象方法,具體由子類事項(xiàng)
public abstract void GetTree();
// 第三部 等待時間建造
// 聲明為抽象方法,具體由子類事項(xiàng)
public abstract void WaitTime();
//返回房子的方法 : 獲得建造好的房子
public abstract House GetHouse();
}
-
步驟二
public class Director { //指揮農(nóng)民假造房屋 public void construct(Builder builder){ builder.GetGold(); builder.GetTree(); builder.WaitTime(); } }?
-
步驟三
public class House { //House組件的集合 private List<String> parts = new ArrayList<String>(); public void ADD(String string) { // TODO Auto-generated method stub parts.add(string); } public void show() { for (int i = 0; i < parts.size(); i++) { System.out.println("組件:"+parts.get(i)+"已經(jīng)有了"); } System.out.println("房子建造完成,請繼續(xù)"); } } 步驟四
public class ConcreateBuilder extends Builder {
//創(chuàng)建產(chǎn)品實(shí)例
House house = new House();
//建造產(chǎn)品
@Override
public void GetGold() {
// TODO Auto-generated method stub
house.ADD("挖礦得金幣");
}
@Override
public void GetTree() {
// TODO Auto-generated method stub
house.ADD("砍樹得木材");
}
@Override
public void WaitTime() {
// TODO Auto-generated method stub
house.ADD("等待建造完成的時間");
}
@Override
public House GetHouse() {
// TODO Auto-generated method stub
return house;
}
}
- 步驟五
public class palyer {
public static void main(String[] args) {
//開始打開游戲
//找到希望玩的種族
Director director = new Director();
Builder builder = new ConcreateBuilder();
//溝通需求后,我們開始進(jìn)行游戲
director.construct(builder);
//東西都搞定了
House house = builder.GetHouse();
//把房子建造出來
house.show();
}
}
結(jié)果
組件:挖礦得金幣已經(jīng)有了
組件:砍樹得木材已經(jīng)有了
組件:等待建造完成的時間已經(jīng)有了
房子建造完成,請繼續(xù)
?
通過上述的例子,我相信大家多少都有一點(diǎn)了解,可能我的這個例子不是特別的適合,但是這也是我想到的一些經(jīng)驗(yàn)和分享,希望大家可以結(jié)合自己的例子來自己分析一遍,謝謝
優(yōu)缺點(diǎn)
在概念和例子解析完成后,我們來分析一下其中的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建的過程進(jìn)行解耦,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品,也就說細(xì)節(jié)以來抽象易于精確控制對象的創(chuàng)建
將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰-
易于拓展
怎家新的具體建造者無需修改原有類庫的代碼,易于拓展,符合開閉原則。每一個具體建造這都相對獨(dú)立,而與其他的具體建造無關(guān),因此可以很方便的替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象。
缺點(diǎn):
- ? 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),起組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此起適用范圍受到一定的限制。
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。
應(yīng)用場景
- 需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對象具備共性;
- 隔離復(fù)雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品。
總結(jié)
希望大家可以好好的探索,以自身的例子為例來好好的學(xué)習(xí)我們這個建造者模式。感謝大家!!