设计模式之建造者模式

建造者模式

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

 结果输出:

 

posted @ 2018-06-25 20:21  王小豆又叫小王子  阅读(148)  评论(0编辑  收藏  举报