设计模式之建造者模式
建造者模式
建造者模式使用多个简单对象一步一步构建成一个复杂对象,属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。
介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
使用场景:需要生成的对象具有复杂的内部结构;需要生成的对象内部属性本身相互依赖。
如何使用:一些基本部件不会变,而其组合经常变化的时候。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
优点:建造者独立,易扩展;便于控制细节风险。
缺点:产品必须有共同点,范围有限制;如果内部变化复杂,会有 很多建造类。
实例
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Code drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮可以是可口可乐(Coke)或百事可乐(Pepsi)它们装在瓶子中。
我们将创建一个食物条目(比如汉堡和冷饮)的Item接口和实现Item接口的实体类,以及一个表示食品包装的Packing接口和实现Packing接口的实体类,汉堡包在纸盒中,冷饮装在瓶子中。
然后我们创建一个Meal类,带Item的ArrayList和一个通过结合Ite来创建Meal对象的MealBuilder。示例中我们演示类使用MealBuilder来创建一个meal.
创建一个表示食物条目和食品包装的接口
/// <summary> /// 食物条目 /// </summary> public interface IItem { String Name(); IPacking Packing(); Double Price(); } /// <summary> /// 食品包装 /// </summary> public interface IPacking { String Packing(); }
创建实现Packing接口的实体类
public class Wrapper:IPacking { public string Packing() { return "Wrapper"; } } public class Bottle : IPacking { public string Packing() { return "Bottle"; } }
创建实现Item接口的抽象类,该类提供了默认的功能:
public abstract class Burger:IItem { public IPacking Packing() { return new Wrapper(); } public abstract Double Price(); public abstract string Name(); } public abstract class ColdDrink : IItem { public IPacking Packing() { return new Bottle(); } public abstract Double Price(); public abstract string Name(); }
创建了扩展Burger和ColdDrink的实体类
public class VegBurger:Burger { public override Double Price() { return 25.0; } public override String Name() { return "Veg Burger"; } } public class ChickenBurger : Burger { public override Double Price() { return 45.0; } public override String Name() { return "Chicken Burger"; } } public class Coke : ColdDrink { public override Double Price() { return 12.0; } public override String Name() { return "Coke"; } } public class Pepsi : ColdDrink { public override Double Price() { return 14.0; } public override String Name() { return "Pepsi"; } }
创建一个Meal类,带有上面定义的Item对象
public class QuickMeal { private List<IItem> m_mealItems = new List<IItem>(); public void AddItem(IItem item) { m_mealItems.Add(item); } public Double GetPrice() { Double price = 0; foreach (var item in m_mealItems) { price += item.Price(); } return price; } public void ShowItems() { foreach (var item in m_mealItems) { Console.Write("Items:"+item.Name()); Console.Write(" Packing:" + item.Packing()); Console.Write(" price:" + item.Price()); Console.WriteLine(); } } }
创建一个MealBuilder类,实际的Builder类负责创建Meal对象
public class QuickMealBuilder { public QuickMeal PrepareVegMeal() { QuickMeal meal = new QuickMeal(); meal.AddItem(new VegBurger()); meal.AddItem(new Coke()); return meal; } public QuickMeal PrepareChickenMeal() { QuickMeal meal = new QuickMeal(); meal.AddItem(new ChickenBurger()); meal.AddItem(new Pepsi()); return meal; } }
客户端使用QuickMealBuilder来构建实例
static void Main(string[] args) { QuickMealBuilder mealBuilder = new QuickMealBuilder(); Console.WriteLine("-=-=-=-=-=-=-=-=-=-=-=-=-"); QuickMeal vegMeal = mealBuilder.PrepareVegMeal(); Console.WriteLine("Veg Meal"); vegMeal.ShowItems(); Console.WriteLine("Total Price:"+vegMeal.GetPrice()); Console.WriteLine("-=-=-=-=-=-=-=-=-=-=-=-=-"); QuickMeal chickenMeal = mealBuilder.PrepareChickenMeal(); Console.WriteLine("Chicken Meal"); chickenMeal.ShowItems(); Console.WriteLine("Total Price:" + chickenMeal.GetPrice()); Console.ReadLine(); }
结果输出: