理解23種設計模式-建立模式-建造者模式
首先介紹一下建造者模式
指將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。它是將一個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
相當於你買配桌上型電腦箱,需要各種零件,這些零件需要你自己去購買,購買成功以後,把這些零件交給專業的人員來幫你組裝,這個機箱就是產品,這個產品也是很複雜的
優點
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模式是為了建立一個複雜的物件,需要多個步驟完成建立,或者需要多個零件組裝的場景,且建立過程中可以靈活呼叫不同的步驟或元件。