开发手册 欢迎您!
软件开发者资料库

设计模式 - 生成器模式

设计模式生成器模式 - 通过简单易用的步骤学习Java设计模式:初学者教程,包含从工厂模式,抽象工厂,单例,构建器,原型,适配器,桥,过滤器,复合,装饰器开始的Java设计模式的完整知识外立面,Flyweight,代理,命令,口译员,迭代器,调解员,纪念品,观察员,状态,空对象,战略,模板,访客,MVC,前端控制器等。

Builder模型使用简单对象并使用逐步方法构建复杂对象.这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一.

Builder类逐步构建最终对象.此构建器独立于其他对象.

实施

我们考虑过快餐店的商业案例,其中典型的餐点可能是汉堡和一杯冷饮.汉堡可以是蔬菜汉堡或鸡肉汉堡,将由包装纸包装.冷饮可以是可乐或百事可乐,也可以装在一个瓶子里.

我们将创建一个 Item 界面,代表汉堡包等食品.实现 Item 界面的冷饮和具体类以及 Packing 界面,表示包装食品和实施包装界面的具体类作为汉堡将是用包装和冷饮包装将打包成瓶子.

然后我们创建一个 Meal 类,其中 ArrayList Item MealBuilder 通过组合 Item 来构建不同类型的 Meal 对象. BuilderPatternDemo ,我们的演示类将使用 MealBuilder 构建 Meal .

构建器模式UML图

步骤1

创建一个表示食品和包装的接口项.

Item.java

public interface Item {   public String name();   public Packing packing();   public float price();}

Packing.java

public interface Packing {   public String pack(); }

步骤2

创建实现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";   }}

步骤3

创建实现项目界面的抽象类,提供默认值功能性.

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 {@Overridepublic Packing packing() {       return new Bottle();}@Overridepublic abstract float price(); }

步骤4

创建扩展Burger和ColdDrink类的具体类

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";   } }

步骤5

创建一个包含上面定义的Item对象的Meal类.

Meal.java

import java.util.ArrayList;import java.util.List;public class Meal {   private List items = new ArrayList();   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());      }   }}

第6步

创建MealBuilder类,负责创建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;   }}

第7步

BuiderPatternDemo使用MealBuider来演示构建器模式.

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

步骤8

验证输出.

Veg MealItem : Veg Burger, Packing : Wrapper, Price : 25.0Item : Coke, Packing : Bottle, Price : 30.0Total Cost: 55.0Non-Veg MealItem : Chicken Burger, Packing : Wrapper, Price : 50.5Item : Pepsi, Packing : Bottle, Price : 35.0Total Cost: 85.5