1. 程式人生 > 其它 >理解23種設計模式-建立模式-建造者模式

理解23種設計模式-建立模式-建造者模式

技術標籤:23種設計模式設計模式java

首先介紹一下建造者模式
指將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。它是將一個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。

相當於你買配桌上型電腦箱,需要各種零件,這些零件需要你自己去購買,購買成功以後,把這些零件交給專業的人員來幫你組裝,這個機箱就是產品,這個產品也是很複雜的

優點
1.封裝性好,構建和表示分離。
2.擴充套件性好,各個具體的建造者相互獨立,有利於系統的解耦。
3.客戶端不必知道產品內部組成的細節,建造者可以對建立過程逐步細化,而不對其它模組產生任何影響,便於控制細節風險。

缺點
1.產品的組成部分必須相同,這限制了其使用範圍。
2.如果產品的內部變化複雜,如果產品內部發生變化,則建造者也要同步修改,後期維護成本較大。

建造者模式的實現
結構
產品角色(Product):它是包含多個組成部件的複雜物件,由具體建造者來建立其各個零部件。
抽象建造者(Builder):它是一個包含建立產品各個子部件的抽象方法的介面
具體建造者(Concrete Builder):實現 Builder 介面,完成複雜產品的各個部件的具體建立方法。
指揮者(Director):它呼叫建造者物件中的部件構造與裝配方法完成複雜物件的建立,在指揮者中不涉及具體產品的資訊。

建造者模式的應用場景


時隔三日如隔春秋,張老闆的生意靠張師傅的炒雞蛋是越來越好,張師傅也是成了遠近聞名的“蛋王”,張老闆決定給他找個改刀的,幫助張師傅做的更快,讓張師傅更方便簡單的完成一盤炒雞蛋!

產品角色:在我們的例子裡就是炒雞蛋!他需要各種食材,我們往復雜一點想,把他當做大工程,需要改刀小弟準備好這些食材
抽象建造者:改刀小弟具體是哪個也不知道
具體建造者:這裡是剛來應聘的小李,負責準備食材
指揮者:蛋王張師傅,負責新增食材烹飪出絕品炒雞蛋

//食材
abstract class Ingredient {
    private String weight;
    protected String name;


    public String getWeight
() { return weight; } public void setWeight(String weight) { this.weight = weight; } @Override public String toString() { return name+weight; } } class Egg extends Ingredient { { name="雞蛋"; } } class Salt extends Ingredient { { name="鹽"; } } class Oil extends Ingredient { { name="豆油"; } } //產品角色 class Fry_egg { //有很多食材 private List<Ingredient> fry_eggList = new ArrayList<>(); public List<Ingredient> getFry_eggList() { return fry_eggList; } public void show() { System.out.println("食材展示"); for (Ingredient ingredient : fry_eggList) { System.out.print(ingredient+"\t"); } } } //改刀的人 abstract class Chef { Fry_egg fry_egg; public abstract Ingredient ready_egg(); public abstract Ingredient ready_salt(); public abstract Ingredient ready_Oil(); } //小李 class LiSer extends Chef { @Override public Ingredient ready_egg() { Egg egg = new Egg(); egg.setWeight("五個"); return egg; } @Override public Ingredient ready_salt() { Salt salt = new Salt(); salt.setWeight("半勺"); return salt; } @Override public Ingredient ready_Oil() { Oil oil = new Oil(); oil.setWeight("一滴噠"); return oil; } } //張大廚 class Cook1 { Chef chef; public Cook1(Chef chef) { this.chef = chef; } public Fry_egg cooking() throws InterruptedException { Fry_egg fry_egg = new Fry_egg(); List<Ingredient> fry_eggList = fry_egg.getFry_eggList(); System.out.println("放入豆油"); fry_eggList.add(chef.ready_Oil()); System.out.println("放入雞蛋"); fry_eggList.add(chef.ready_egg()); System.out.println("放半勺鹽"); fry_eggList.add(chef.ready_salt()); Thread.sleep(1000*2); System.out.println("出鍋"); return fry_egg; } } public class BuilderPattern { public static void main(String[] args) { LiSer liSer = new LiSer(); Cook1 cook1 = new Cook1(liSer); Fry_egg cooking = null; try { cooking = cook1.cooking(); } catch (InterruptedException e) { System.out.println("炒糊了"); e.printStackTrace(); } cooking.show(); } }

輸出結果

放入豆油
放入雞蛋
放半勺鹽
出鍋
食材展示
豆油一滴噠 雞蛋五個 鹽半勺

小結:
Builder模式是為了建立一個複雜的物件,需要多個步驟完成建立,或者需要多個零件組裝的場景,且建立過程中可以靈活呼叫不同的步驟或元件。