转载

Design Patterns - Builder Pattern(译)

原文链接

译者: 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();     } 

Packing.java

public interface Packing {    public String pack(); } 

第二步

创建具体的类来实现 Packing 接口。

Wrapper.java

public class Wrapper implements Packing {     @Override    public String pack() {       return "Wrapper";    } } 

Bottle.java

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(); } 

ColdDrink.java

public abstract class ColdDrink implements Item {      @Override     public Packing packing() {        return new Bottle();     }      @Override     public abstract float price(); } 

第三步

创建具体的类继承 BurgerColdDrink 类。

VegBurger.java

public class VegBurger extends Burger {     @Override    public float price() {       return 25.0f;    }     @Override    public String name() {       return "Veg Burger";    } } 

ChickenBurger.java

public class ChickenBurger extends Burger {     @Override    public float price() {       return 50.5f;    }     @Override    public String name() {       return "Chicken Burger";    } } 

Coke.java

public class Coke extends ColdDrink {     @Override    public float price() {       return 30.0f;    }     @Override    public String name() {       return "Coke";    } } 

Pepsi.java

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,这里只做简单的介绍。

原文  https://segmentfault.com/a/1190000004736240
正文到此结束
Loading...