設計模式之建造者模式(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