• 设计模式之建造者模式


    建造者模式

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

     结果输出:

  • 相关阅读:
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS01-线性表
    c博客06-结构体&文件
    C博客作业05--指针
    123
    面向对象设计大作业
    购物车
    有理数类的设计
  • 原文地址:https://www.cnblogs.com/mohanchen/p/9226124.html
Copyright © 2020-2023  润新知