设计模式总结(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