建造者模式

1 介紹


Builder模式是一種對象創(chuàng)建型模式。主要用來隱藏復(fù)合對象的創(chuàng)建過程,復(fù)合對象的創(chuàng)建抽象出來,通過子類繼承或重載的方式,動態(tài)的創(chuàng)建復(fù)合對象。

建造者模式的幾個角色

  • Builder:抽象建造者 --- Product中各個復(fù)合對象的接口
  • ConcreateBuidler:具體建造者 --- 實現(xiàn)抽象接口并加以實現(xiàn)
  • Director:指揮者
  • Product:產(chǎn)品角色 --- 一個具體的產(chǎn)品對象

先舉個例子來理解下幾個角色的意思:
<a>當(dāng)我們?nèi)コ詋fc時,我們需要先告訴服務(wù)員(Director)我們需要點什么套餐(ConcreateBuilder),然后廚房(Builder)再根據(jù)套餐去選擇合適的單品(Product。</a>

2 實現(xiàn)


產(chǎn)品角色:Product.class

public class Meal {
    private String food;
    private String drink;
    
    public String getFood() {
        return food;
    }
    public void setFood(String food) {
        this.food = food;
    }
    public String getDrink() {
        return drink;
    }
    public void setDrink(String drink) {
        this.drink = drink;
    }
    @Override
    public String toString() {
        return "Meal [food=" + food + ", drink=" + drink + "]";
    }   
}

抽象建造者:Kitchen.class


public interface Kitchen {
    void makeFood();
    void makeDrink();
    Meal getMeal();
}

具體建造者:MealA.class/MealB.class

public class MealA implements Kitchen{
    Meal meal = new Meal();
    @Override
    public void makeFood() {
        meal.setFood("套餐A--生產(chǎn)食物");
    }

    @Override
    public void makeDrink() {
        meal.setDrink("套餐A--生產(chǎn)飲料");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
    
}
public class MealB implements Kitchen{
    Meal meal = new Meal();
    @Override
    public void makeFood() {
        meal.setFood("套餐B--生產(chǎn)食物");
    }

    @Override
    public void makeDrink() {
        meal.setDrink("套餐B--生產(chǎn)飲料");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
    
}

指揮者:Waiter.class

public class Waiter {
    private Kitchen kitchen;
    public Waiter (Kitchen kitchen) {
        this.kitchen = kitchen;
    }
    
    public Kitchen getMeal(){
        kitchen.makeFood();
        kitchen.makeDrink();
        return kitchen;
    }
}

測試:MainClass.class

public class MainClass {
    public static void main(String[] args) {
        
        Kitchen meal = new MealA();
        Waiter waiter = new Waiter(meal);
        waiter.getMeal();
        Meal meal2 = meal.getMeal();
        System.out.println(meal2.toString());

    }
}
運行結(jié)果

3 優(yōu)缺點


優(yōu)點:

  • 將產(chǎn)品的創(chuàng)建過程與產(chǎn)品本身分離出來,可以根據(jù)相同的創(chuàng)建過程得到不同的產(chǎn)品。
  • 將復(fù)雜的產(chǎn)品創(chuàng)建過程進行分解,讓整個創(chuàng)建過程增次化,這樣可以讓開發(fā)人員更加方便的進行操控。

缺點

  • 如果產(chǎn)品的的內(nèi)部結(jié)構(gòu)很復(fù)雜,可能會導(dǎo)致需要定義很多的具體建造者來實現(xiàn)這些變化,導(dǎo)致代碼量過多。

上一篇:原型模式
下一篇:裝飾模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容