原文链接
译者: smallclover
个人翻译,水平有限,如有错误欢迎指出,谢谢!
生成器模式使用简单的对象来逐步的构建一个复杂的对象。这种类型的设计模式是创建型模式中创建对象最好的方式之一。一个生成器类会逐步的构建这个最终的对象。这个生成器与其他对象是相互独立的。
我们举一个快餐店的案例:这个快餐店的典型饮食风格是一个汉堡加一杯可乐。这里的汉堡可以是蔬菜汉堡也可以是鸡肉汉堡,它们将使用包装纸来包装;冷饮可以是可口可乐或者是百事可乐,它们将使用瓶子来包装。
我们将创建一个 Item 接口代表食品元素如汉堡和冷饮,创建具体的类实现这个 Item 接口; Packing 接口代表包装食品元素,创建具体的类实现这个 Packing 接口,像汉堡可以通过包装纸来包装,冷饮可以通过瓶子来包装。
我们随后将创建一个 Meal 类,它有一个存储 Item 类型的 ArrayList ,然后我们使用一个 MealBuilder 来结合 Item 来构建不同类型的 Meal 对象。 BuilderPatternDemo ,我们的demo类将使用 MealBuilder 将会构建一个 Meal 。
创建一个接口 Item 代表食品元素和一个 Packing 接口代表包装的情况。
Item.java
public interface Item { public String name(); public Packing packing(); public float price(); } public interface Packing { public String pack(); } 创建具体的类来实现 Packing 接口。
Wrapper.java
public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } } 创建多个抽象类实现 Item 接口提供默认的功能。
Burger.java
public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); } public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); } 创建具体的类继承 Burger 和 ColdDrink 类。
VegBurger.java
public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } } public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } } public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } } public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } } 创建一个 Meal 类,该类包含一个 Item 的集合。
Meal.java
import java.util.ArrayList; import java.util.List; 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 : " + item.name()); System.out.print(", Packing : " + item.packing().pack()); System.out.println(", Price : " + item.price()); } } } Step 6
创建一个 MealBuilde r类,这个类负责实际创建 Meal 对象。
MealBuilder.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; } } BuilderPatternDemo 使用 MealBuilder 来演示生成器模式
BuilderPatternDemo.java
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " + vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("/n/nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " + nonVegMeal.getCost()); } } 校验输出
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5 注意区分抽象工厂模式和生成器模式的区别:生成器模式的是生产一个复杂的产品,抽象工厂模式是生产一个族的产品。具体请参考文章 生成器模式与抽象工厂模式的区别 。若无法理解请自行Google,这里只做简单的介绍。