android設計模式——建造者模式
阿新 • • 發佈:2018-11-06
Builder模式就是相比於一輛汽車有各個部件 但是不同的汽車有不同的部件 但是裝配成一輛車的方法相同
例子:比如肯德基有漢堡,雞翅,可樂,但是不同的套餐 是不同的組合
使用場景:
- 相同的方法,不同的執行順序產生不同的結果,
- 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不同。
- 產品類非常複雜,或者產品類的呼叫順序不同產生不同的結果。
- 初始化一個物件特別複雜,如引數多,且很多引數都具有預設值。
類圖:
- Produce 產品類-產品的抽象類
- Builder - 抽象的Builder 類 規範產品的元件 一般是有子類實現具體的元件過程;
- ConcreteBuilder-具體的bulider 類
- Director-統一的組裝過程
自我理解分為三類,產品,組裝,具體實現
產品:電腦,內容有主機板,顯示器,作業系統
組裝:將主機板,顯示器,作業系統安裝到電腦
具體實現:new BuilderTest().setA("A").setB("B").create();
abstract class Computer{ protected String mBoard;//主機板 顯示器 作業系統 protected String mDisplay; protected String mOS; protected Computer() {} public void setmBoard(String mBoard) { this.mBoard = mBoard; } public void setmDisplay(String mDisplay) { this.mDisplay = mDisplay; } public abstract void setmOS() ;//這個是抽象方法 public String toString() { return "Computer: 主機板是:"+mBoard+"顯示器是"+mDisplay+"作業系統是"+mOS; } } //具體的電腦類 MacBook class Macbook extends Computer{ protected Macbook() { // TODO 自動生成的建構函式存根 } @Override public void setmOS() { // TODO 自動生成的方法存根 mOS = "Mac OS X 10.10"; } } abstract class Builder{ public abstract void buildBoard(String board); public abstract void buildDisplay(String display); public abstract void buildOs(); public abstract Computer create(); } class MacbookBuilder extends Builder{ private Computer mComputer = new Macbook(); @Override public void buildBoard(String board) { // TODO 自動生成的方法存根 mComputer.setmBoard(board); } @Override public void buildDisplay(String display) { // TODO 自動生成的方法存根 mComputer.setmDisplay(display); } @Override public void buildOs() { // TODO 自動生成的方法存根 mComputer.setmOS(); } @Override public Computer create() { // TODO 自動生成的方法存根 return mComputer; } } // class Director{//相當於組裝 Builder mBuilder = null; public Director (Builder builder) { this.mBuilder = builder; } public void Construct(String board,String display) { mBuilder.buildBoard(board); mBuilder.buildDisplay(display); mBuilder.buildOs(); } }
主函式
public static void main(String[] args) {
// TODO 自動生成的方法存根
Builder builder = new MacbookBuilder();
Director director = new Director(builder);
director.Construct("英特爾主機板", "Retinax顯示器");
System.out.println("電腦資訊"+builder.create().toString());
}
new BuilderTest().setA("A").setB("B").create();//去除了Director角色,直接使用Builder()使整個結構變得簡單
要點:
- 構造方法是protect型別
- 比如一個類需要很多構造方法,但是不同的構造方法需要不同的引數,這時就可以使用建造者模式,一次性把所有的引數列完(避免寫多個不同的建構函式)需要使用的引數進行設定,不使用的引數為預設值,然後構造!