建造者模式
建造者模式使用多个简单对象一步一步构建成一个复杂对象,属于创建型模式,它提供了一种创建对象的最佳方式。一个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();
}
结果输出:
