設計模式(5)-建造者模式詳解(易懂)

秦子帥發表於2018-01-17

建造者模式定義

定義:建造者模式是設計模式的一種,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

image

先分析模型圖上的四大部分:

  • Product:產品類,指要建立的複雜物件,通常實現了模板方法模式。

  • Builder:抽象建造類,規範產品的組建,一般是由子類實現的。

  • ConcreteBuilder:具體建造類,實現抽象建造類定義的方法並返回一個建造好的物件。

  • Director:導演類,也就是指揮者,負責安排流程。

例項說明

就拿建造房屋舉例吧:這裡假設建造兩種型別的房屋,別墅和普通房屋;兩種型別的建造流程順序不同;別墅為A-B-C三步,普通房屋為C-B-A三步。

** 1.首先定義出Product類,VillaModel和OrdinaryhouseModel**

(1).抽象產品類


public abstract class HouseModel  {
   //定義執行的順序,放在集合內
   private List<String> OrderList=new ArrayList<>();

   //建造房屋的步驟,不分先後,不同的房屋,順序不同
   protected  abstract  void buildstepA();
   protected  abstract  void buildstepB();
   protected  abstract  void buildstepC();
  /*
  建造房屋
   */
   final  public void build(){
       for (int i=0;i<this.OrderList.size();i++){
           String name =this.OrderList.get(i);
           if (name.equalsIgnoreCase("stepA")){
               this.buildstepA();
           }else if (name.equalsIgnoreCase("stepB")){
               this.buildstepB();
           }else if (name.equalsIgnoreCase("stepC")){
               this.buildstepC();
           }
       }

   }
   //設定順序
   public void setOrderList(List<String> orderList) {
       OrderList = orderList;
   }
}

複製程式碼

(2).兩個實現類


public class VillaModel extends HouseModel {
   @Override
   protected void buildstepA() {
    System.out.println("別墅建造步驟A操作");   
   }

   @Override
   protected void buildstepB() {
       System.out.println("別墅建造步驟B操作");
   }

   @Override
   protected void buildstepC() {
       System.out.println("別墅建造步驟C操作");
   }
}

public class OrdinaryhouseModel extends HouseModel {
   @Override
   protected void buildstepA() {
       System.out.println("普通房屋建造步驟A操作");
   }

   @Override
   protected void buildstepB() {
       System.out.println("普通房屋建造步驟B操作");
   }

   @Override
   protected void buildstepC() {
       System.out.println("普通房屋建造步驟C操作");
   }
}

複製程式碼

2.定義Builder抽象建造類,也就是寫兩種房屋的建造方式.


public abstract class HouseBuilder  {
   //為了設定建造順序
   public  abstract  void  setOrderList(List<String> orderList);

   //獲取安排完建造順序的對應的房屋
   public  abstract  HouseModel getHouseModel();
}

複製程式碼

3.定義ConcreteBuilder具體建造類,也就是兩種房屋建造類實現上面定義的Builder

//別墅
public class VillaBuilder extends HouseBuilder {
   private  VillaModel villaModel=new VillaModel();
   @Override
   public void setOrderList(List<String> orderList) {
       this.villaModel.setOrderList(orderList);
   }

   @Override
   public HouseModel getHouseModel() {
       return this.villaModel;
   }
}

//普通房屋
public class OrdinaryhouseBuilder extends HouseBuilder {
   private  OrdinaryhouseModel ordinaryhouseModel=new OrdinaryhouseModel();
   @Override
   public void setOrderList(List<String> orderList) {
       this.ordinaryhouseModel.setOrderList(orderList);
   }

   @Override
   public HouseModel getHouseModel() {
       return this.ordinaryhouseModel;
   }
}

複製程式碼

**注意:**上面的準備工作都做完了,為了更深刻的理解Director<導演類>,我們先不加Director,直接去實現此例項。

不加入Director類,實現方式就是直接設定順序,以建造別墅為例,程式碼如下:


       List<String> OrderList=new ArrayList<>();
       OrderList.add("stepA");
       OrderList.add("stepB");
       OrderList.add("stepC");

       VillaBuilder villaBuilder=new VillaBuilder();
       villaBuilder.setOrderList(OrderList);

       VillaModel villaModel= (VillaModel) villaBuilder.getHouseModel();
       villaModel.build();
複製程式碼

這還只是別墅的建造,程式碼是不是很臃腫?所以封裝是必須的,既加上Director類來指揮(封裝)順序。

4.定義Director類,也就是對已知的兩種房屋的建造步驟進行封裝

public class Director {
   private List<String> OrderList=new ArrayList<>();
   private  OrdinaryhouseBuilder ordinaryhouseBuilder=new OrdinaryhouseBuilder();
   private  VillaBuilder villaBuilder=new VillaBuilder();
/*
普通房屋建造步驟封裝
*/
   public OrdinaryhouseModel getHouseModel(){
       this.OrderList.clear();
       this.OrderList.add("stepC");
       this.OrderList.add("stepB");
       this.OrderList.add("stepA");
       this.ordinaryhouseBuilder.setOrderList(OrderList);
       return (OrdinaryhouseModel) this.ordinaryhouseBuilder.getHouseModel();
   }
   /*
   別墅建造步驟封裝
    */
   public VillaModel getvillaModel(){
       this.OrderList.clear();
       this.OrderList.add("stepA");
       this.OrderList.add("stepB");
       this.OrderList.add("stepC");
       this.villaBuilder.setOrderList(OrderList);
       return (VillaModel) this.villaBuilder.getHouseModel();
   }

}

複製程式碼

這時實現例項的程式碼如下:


       Director director=new Director();
       director.getHouseModel().build();
       director.getvillaModel().build();

複製程式碼

執行結果:

設計模式(5)-建造者模式詳解(易懂)

加入了Director類後呼叫是不是感覺很簡單,清晰了。另外如果兩種房屋的建造步驟有變化了,可以直接在Director類封裝新的順序。

建造者模式應用

1.實用範圍

  • 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。

  • 當構造過程必須允許被構造的物件有不同表示時。

2.建造者模式的優缺點

(1).優點

  • 封裝性好

  • 具體建造類之間獨立,擴充套件性好

(2).缺點

產生多餘的Build物件以及Dirextor類。

3.建****造者模式與工廠模式的區別

這兩種模式很相似,建造者模式更注重於方法的呼叫順序,而工廠模式注重於建立產品。具體的區別還是推薦大家去親身去了解一下這兩種模式。

文章學習參考了《設計模式之禪》《Android進階之光》


另外可以加入我的Android技術交流群:458739310 大家可以關注我的微信公眾號:「安卓乾貨鋪」一個有質量、有態度的公眾號!

設計模式(5)-建造者模式詳解(易懂)

相關文章