正文
建造者模式(Builder)
一、概述
建造者模式属于创建型设计模式,它主要是将一个复杂对象的构建与表示分离,使用多个简单的对象一步一步构建成一个复杂的对象,它提供了一种创建对象的最佳方式。建造者模式将复杂产品的构建过程封装在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。但是如果某个产品的内部结构过于复杂,将会导致整个系统变得非常庞大,不利于控制,同时若干个产品之间存在较大的差异,则不适用建造者模式,毕竟这个世界上存在相同点大的两个产品不多,所以它的使用范围有限。其UML结构图如下:
二、示例
假设现在有一个快餐店,其中销量最好的一款套餐就是一个汉堡和一杯饮料。而汉堡有素食汉堡(veg Burger)和鸡肉汉堡(Chicken Burger)可供选择、饮料有可口可乐(coke)和百事可乐(pepsi)可以选择。所以该示例的UML为:
下面开始展示代码:首先创建一个食物条目和食物包装的接口:
//食物条目 public interface Item { public String name(); public Packing packing(); public float price(); }
//食物条目 public interface Item { public String name(); public Packing packing(); public float price(); }
然后是实现Packing的实现类
//用于装汉堡 public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } //用于装饮料 public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
实现item接口的抽象类
//抽象类 汉堡 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(); }
实体类:
// 素菜汉堡 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对象
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()); } } }
再创建一个MealBuilder负责创建Meal
public class MealBuilder { //套餐1 素汉堡 public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } //套餐2 鸡肉汉堡 public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }
测试类:
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