什麼是建造者模式設計模式
所謂建造者模式,就是將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示的設計模式。建造者模式在構建過程當中隱藏了複雜的實現細節,能夠大大下降代碼耦合度。ide
建造者模式的實現方式oop
《水滸傳》講述了的故事,梁山泊是一個不斷壯大的隊伍ui
先寫一個Troops:this
public abstract class Troops {
protected String leader; protected ArrayList<String> others = new ArrayList<>(); protected String purpose;
//領袖 public void setLeader(String leader) { this.leader = leader; }
//其餘人 public void setOthers(String... others) { for (String other:others){ this.others.add(other); } }
//宗旨 public abstract void setPurpose();
@Override public String toString() { return "Troops{" + "leader='" + leader + '\'' + ", others=" + others.toString() + ", purpose='" + purpose + '\'' + '}'; } }spa |
這是梁山的Troops:設計
public class Liangshan extends Troops {
protected Liangshan(){}
@Override public void setPurpose() { purpose = "替天行道"; } }orm |
再寫一個Builder:對象
public abstract class Builder {
public abstract void buildLeader(String leader);
public abstract void buildOthers(String... others);
public abstract void buildPurpose();
public abstract Troops create();
}blog |
這是好漢們的Builder:
public class LiangshanBuilder extends Builder {
private Liangshan liangshan;
@Override public void buildLeader(String leader) { liangshan.setLeader(leader); }
@Override public void buildOthers(String... others) { liangshan.setOthers(others); }
@Override public void buildPurpose() { liangshan.setPurpose(); }
@Override public Troops create() { return liangshan; } } |
接下來寫一個Director:
public class Director {
Builder mBuilder = null;
public Director(Builder builder){ this.mBuilder = builder; }
public void construct(String leader,String... others){ mBuilder.buildLeader(leader); mBuilder.buildOthers(others); mBuilder.buildPurpose(); }
} |
咱們只須要以下代碼即可以實現梁山好漢的大聚義:
Builder builder = new LiangshanBuilder(); Director director = new Director(builder); director.construct("宋江","盧俊義","吳用","公孫勝"); Log.e("梁山",builder.create().toString()); |
在實際開發過程當中,Director層經常被省略,由一個鏈式調用的Builder來進行對象的組裝。咱們此次用梁山好漢的對立面——方臘來舉例,此次這麼改寫上文的Builder:
public class MingjiaoBuilder{ private Mingjiao mingjiao;
public MingjiaoBuilder(){ mingjiao = new Mingjiao(); }
public MingjiaoBuilder buildLeader(String leader) { mingjiao.setLeader(leader); return this; }
public MingjiaoBuilder buildOthers(String... others) { mingjiao.setOthers(others); return this; }
public MingjiaoBuilder buildPurpose() { mingjiao.setPurpose(); return this; }
public Mingjiao create() { return mingjiao; } } |
固然,Troops是這樣繼承的:
public class Mingjiao extends Troops { @Override public void setPurpose() { this.purpose = "做亂犯上"; } } |
而後方臘做亂犯上的過程是這樣的:
MingjiaoBuilder builder = new MingjiaoBuilder() //雖是妄稱天子位 .buildLeader("方臘") //也須僞列宰臣班 .buildOthers("石寶","鄧元覺","方傑") .buildPurpose(); Log.e("明教",builder.create().toString()); |
Android源碼中的建造者模式
(1)AlertDialog.Builder
AlertDialog.Builder是Android源碼中最多見的建造者模式,調用方式再也不贅述。不過請注意這個建造者模式中並無Director層的出現,所以這是一種簡化的建造者模式。
Android開發中如何利用建造者模式
(1)建造者模式具有封裝性良好的優勢。在一個對象的初始化特別複雜、而且不少參數都有默認值時的優點很是明顯。
(2)建造者模式還具有Builder獨立、易於擴展的優勢。能夠在幾個setter方法執行順序不一樣時產生不一樣的結果。
須要注意的幾個問題
(1)建造者模式會產生多餘的Builder對象和Director對象,是典型的用運行效率換開發進度的設計模式
本系列其餘博客
【設計模式與Android】原型模式——複製中心走出來的克隆人
【設計模式與Android】工廠方法模式——化工女神的工廠
【設計模式與Android】抽象工廠模式——嵌合體克隆工廠
【設計模式與Android】策略模式——錦囊裏的上策中策下策
【設計模式與Android】狀態模式——一我的的兩幅面孔