建造者模式定義算法
定義:建造者模式是設計模式的一種,將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。設計模式
先分析模型圖上的四大部分:微信
就拿建造房屋舉例吧:這裏假設建造兩種類型的房屋,別墅和普通房屋;兩種類型的建造流程順序不一樣;別墅爲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
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!