建造者模式

建造者模式

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)

開始步驟

  1. 步驟一
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();
}

  1. 步驟二

    public class Director {
    
     //指揮農(nóng)民假造房屋
     public void construct(Builder builder){
         builder.GetGold();
         builder.GetTree();
         builder.WaitTime();
     }
    }
    
    

    ?

  2. 步驟三

    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ù)");
     }
    }
    
  3. 步驟四

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;
  }
  
  
  
}
  1. 步驟五
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)

  1. 易于解耦
    將產(chǎn)品本身與產(chǎn)品創(chuàng)建的過程進(jìn)行解耦,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品,也就說細(xì)節(jié)以來抽象

  2. 易于精確控制對象的創(chuàng)建
    將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰

  3. 易于拓展
    怎家新的具體建造者無需修改原有類庫的代碼,易于拓展,符合開閉原則。

    每一個具體建造這都相對獨(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í)我們這個建造者模式。感謝大家!!

又想到一個例子,希望有空可以看一看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容