設計模式總結(7)
阿新 • • 發佈:2018-11-03
設計模式總結(7)
建造者模式
建造者模式用於解決在細節上經常變化,但是組合上卻相對穩定的場景。比如我們去快餐店點餐,可能有時候點的是素食漢堡,有時候點的是雞肉漢堡,但不管點的是哪種漢堡,它們都是裝在紙盒中的;同理,有時候喝的的百事可樂,有時候喝的是可口可樂,它們都是狀態瓶子中的。雖然點的餐不同,但是組合是大致不變的,變的只是價格和食材。
優點: 建造者獨立易拓展,便於控制細節
缺點: 產品具有共同點,範圍限制;內部變化複雜,有很多的建造類
定義一個表示食物名稱和價格的介面:
public interface Item {
/**
* 食材名稱
* @return
*/
String name();
/**
* 包裝
* @return
*/
Packing packing();
/**
* 價格
* @return
*/
float price();
}
定義一個包裝介面:
public interface Packing {
/**
* 表示包裝
* @return
*/
String pack();
}
定義實現包裝介面的紙盒類和瓶子類:
public class Bottle implements Packing {
/**
* 表示包裝
* 包裝為瓶子
*
* @return
*/
@Override
public String pack() {
return "Bottle";
}
}
public class Wrapper implements Packing {
/**
* 表示包裝
* 包裝為紙盒
*
* @return
*/
@Override
public String pack() {
return "Wrapper";
}
}
定義實現Item的抽象類,比如漢堡和冷飲:
public abstract class Burger implements Item{
/**
* 包裝
* 漢堡的包裝為紙盒
* @return
*/
@Override
public Packing packing() {
return new Wrapper();
}
/**
* 價格
*
* @return
*/
@Override
public abstract float price();
}
public abstract class ColdDrink implements Item {
/**
* 包裝
* 冷飲包裝為瓶子
* @return
*/
@Override
public Packing packing() {
return new Bottle();
}
/**
* 價格
*
* @return
*/
@Override
public abstract float price();
}
實現具體的不同種類的漢堡和可樂:
/**
* 素食漢堡
*/
public class VegBurger extends Burger {
/**
* 價格
*
* @return
*/
@Override
public float price() {
return 25.0f;
}
/**
* 食材名稱
*
* @return
*/
@Override
public String name() {
return "Veg Burger";
}
}
/**
* 雞肉漢堡
*/
public class ChickenBurger extends Burger{
/**
* 價格
*
* @return
*/
@Override
public float price() {
return 50.5f;
}
/**
* 食材名稱
*
* @return
*/
@Override
public String name() {
return "Chicken Burger";
}
}
/**
* 百事可樂
*/
public class Pepsi extends ColdDrink {
/**
* 價格
*
* @return
*/
@Override
public float price() {
return 35.0f;
}
/**
* 食材名稱
*
* @return
*/
@Override
public String name() {
return "Pepsi";
}
}
/**
* 可口可樂
*/
public class Coke extends ColdDrink {
/**
* 價格
*
* @return
*/
@Override
public float price() {
return 30.0f;
}
/**
* 食材名稱
*
* @return
*/
@Override
public String name() {
return "Coke";
}
}
建立一個Meal類,負責組裝食材、定義價格:
/**
* 具體建立不同組合的食物
*/
public class MealBuilder {
public Meal prepareVegMeal() {
Meal meal = new Meal();
meal.addItem(new VegBurger());
meal.addItem(new Coke());
return meal;
}
public Meal prepareNonVegMeal() {
Meal meal = new Meal();
meal.addItem(new ChickenBurger());
meal.addItem(new Pepsi());
return meal;
}
}
測試:
public class BuiderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
Meal vegMeal = mealBuilder.prepareVegMeal();
System.out.println("Veg Meal");
vegMeal.showItem();
System.out.println("Total Cost: " +vegMeal.getCost());
Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
System.out.println("Non-Veg Meal");
nonVegMeal.showItem();
System.out.println("Total Cost: " +nonVegMeal.getCost());
}
}
結果:
Veg Meal
Total Cost: 55.0
Non-Veg Meal
Total Cost: 85.5