建造者模式是一种创建型模式
建造者模式,其实主要的作用是将复杂对象的创建分为多个简单单一对象的组合
java
public interface Item {
public String name();
public Packing packing();
public float price();
}
这是一个商品的基类,所有的商品都为此类扩展
java
public abstract class Burger implements Item {
@Override
public Packing packing() {
return new Wrapper();
}
@Override
public abstract float price();
}
java
public class ChickenBurger extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "鸡包";
}
}
这是一个详细商品的信息,由价格名称和打包方式构成,如果需要添加新的该类型商品,只需要继承基类,有好的扩展性,符合开闭原则。
java
public class Meal {
private List<Item> items = new ArrayList<Item>();
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.print("商品有 : " + item.name());
System.out.print(", 使用包装 : " + item.packing().pack());
System.out.println(", 价格 : " + item.price());
}
}
}
这是一个最终产品的类(Product)对象(套餐),他由多个简单的商品类构成,还有一些简单的处理。
java
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;
}
}
指挥者类(Director)主要负责创建不同的复杂对象,不同的商品类都继承了基类,所以meal对象可以把不同的商品对象装入统一的列表中
java
public class BuilderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
Meal vegMeal = mealBuilder.prepareVegMeal();
System.out.println("蔬菜套餐");
vegMeal.showItems();
System.out.println("总计: " +vegMeal.getCost());
Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
System.out.println("\n\n鸡肉套餐");
nonVegMeal.showItems();
System.out.println("总计: " +nonVegMeal.getCost());
}
}
最后在调用的时候,只需要创建MealBuilder 就可以调用不同的套餐对象
如果需要新增新的套餐,只需要在指挥者类中添加新的方法调用不同接口就可以实现类型扩展。
git地址:
Design_pattern: 设计模式https://gitee.com/qiminghaonan123/design_pattern.git