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

建造者模式定義算法

定義:建造者模式是設計模式的一種,將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。設計模式

image

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

  • Product:產品類,指要建立的複雜對象,一般實現了模板方法模式。
  • Builder:抽象建造類,規範產品的組建,通常是由子類實現的。
  • ConcreteBuilder:具體建造類,實現抽象建造類定義的方法並返回一個建造好的對象。
  • Director:導演類,也就是指揮者,負責安排流程。

實例說明

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

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

(1).抽象產品類ui

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).兩個實現類this

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抽象建造類,也就是寫兩種房屋的建造方式.spa

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,直接去實現此實例。code

不加入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();

運行結果:

加入了Director類後調用是否是感受很簡單,清晰了。另外若是兩種房屋的建造步驟有變化了,能夠直接在Director類封裝新的順序。

建造者模式應用

1.實用範圍

  • 當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  • 當構造過程必須容許被構造的對象有不一樣表示時。

2.建造者模式的優缺點

(1).優勢

  • 封裝性好
  • 具體建造類之間獨立,擴展性好

(2).缺點

產生多餘的Build對象以及Dirextor類。

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

這兩種模式很類似,建造者模式更注重於方法的調用順序,而工廠模式注重於建立產品。具體的區別仍是推薦你們去親身去了解一下這兩種模式。

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


另外能夠加入個人Android技術交流羣:458739310
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索