1. 程式人生 > >設計模式之建造者模式(Builder Pattern)(一)

設計模式之建造者模式(Builder Pattern)(一)

建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
一個 Builder 類會一步一步構造最終的物件。該 Builder 類是獨立於其他物件的。
意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候
如何解決:將變與不變分離開。
關鍵程式碼:建造者:建立和提供例項,導演:管理建造出來的例項的依賴關係。
應用例項: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder
優點: 1、建造者獨立,易擴充套件。 2、便於控制細節風險。
缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的物件具有複雜的內部結構。 2、需要生成的物件內部屬性本身相互依賴。
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。

程式碼:
1.測試程式碼
一個builder負責生產餐食

public class Test {
    public static void main(String[] args) {
        MealBuilder builder=new MealBuilder();
        Meal vegMeal=builder.prepareVegetableMeal();
        vegMeal.showItems();
        System.out.println("總共花費:"+vegMeal.getCost());
        Meal chickenMeal=builder.prepareNonVegetableMeal();
        chickenMeal.showItems();
        System.out.println("總共花費:"+chickenMeal.getCost());
    }
}

2.builder

public class MealBuilder {
    
    public Meal prepareVegetableMeal() {
        Meal meal=new Meal();
        meal.addItem(new VegetableBurger());
        meal.addItem(new Coke());
        return meal;
    }
    
    public Meal prepareNonVegetableMeal() {
        Meal meal=new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        return meal;
    }
    
}

Meal

public class Meal {
    private List<Item> items=new ArrayList<>();
    
    public void addItem(Item item) {
        items.add(item);
    }
    
    //計算所有的價格
    public float getCost() {
        float cost=0.0f;
        for (Item item : items) {
            cost+=item.price();
        }
        return cost;
    }
    
    public void showItems() {
        for (Item item : items) {
            System.out.println("購買:"+item.name()+",包裝:"+item.packing().pack()+",價格:"+item.price());
        }
    }
}

3.單項

public interface Item {
    String name();
    Packing packing();
    float price();
}

包裝

public interface Packing {
    public String pack();
}

4.具體東西
1)瓶子

public class Bottle implements Packing{

    @Override
    public String pack() {
        return "瓶子";
    }

}

2)包裝紙

public class Wrapper implements Packing{

    @Override
    public String pack() {
        return "包裝紙";
    }

}

4)漢堡

public  abstract class Burger implements Item{

    @Override
    public Packing packing() {
        return new Wrapper();
    }

}

4.1)蔬菜漢堡

//素食漢堡 25塊
public class VegetableBurger  extends Burger{

    @Override
    public String name() {
        return "蔬菜漢堡";
    }

    @Override
    public float price() {
        return 25.0f;
    }

}

4.2)雞肉漢堡

//雞肉漢堡 50塊
public class ChickenBurger extends Burger{

    @Override
    public String name() {
        return "雞肉漢堡";
    }

    @Override
    public float price() {
        return 50.0f;
    }

}

5)飲料

public abstract class ColdDrink  implements Item{

    @Override
    public Packing packing() {
        return new Bottle();
    }

}

5.1)可口可樂

public class Coke extends ColdDrink{

    @Override
    public String name() {
        return "可口可樂";
    }

    @Override
    public float price() {
        return 15.0f;
    }

}

5.2)百事可樂

public class Pepsi  extends ColdDrink{

    @Override
    public String name() {
        return "Pepsi";
    }

    @Override
    public float price() {
        return 20.0f;
    }

}

6.測試結果

購買:蔬菜漢堡,包裝:包裝紙,價格:25.0
購買:可口可樂,包裝:瓶子,價格:15.0
總共花費:40.0
購買:雞肉漢堡,包裝:包裝紙,價格:50.0
購買:Pepsi,包裝:瓶子,價格:20.0
總共花費:70.0

7.結論
通過builder模式簡化了複雜的建立過程。

轉載於
http://www.runoob.com/design-pattern/builder-pattern.html