建造者模式实例

用户需求:

设计思路:

       1.UML图

       

        2.采用建造者模式讲一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。

        3.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过制定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

具体代码实现:

     1.抽象部件

        Part类       

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public abstract class Part
    {
        public abstract void Show();
    }
}

     2.具体部件

        MCBurger 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MCBurger:Part
    {
        public override void Show()
        {
            Console.WriteLine("麦当劳:双层吉士汉堡");
        }

    }
}

        MCChips 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MCChips:Part
    {
        public override void Show()
        {
            Console.WriteLine("麦当劳:薯条");
        }
    }
}

        MCDrink 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MCDrink:Part
    {
        public override void Show()
        {
            Console.WriteLine("麦当劳:可口可乐");
        }
    }
}

        KFCBurger 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class KFCBurger:Part
    {
        public override void Show()
        {
            Console.WriteLine("肯德基:香辣鸡腿堡");
        }
    }
}

        KFCChips 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class KFCChips:Part
    {
        public override void Show()
        {
            Console.WriteLine("肯德基:薯条");
        }
    }
}

        KFCDrink 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class KFCDrink:Part
    {
        public override void Show()
        {
            Console.WriteLine("肯德基:百事可乐");
        }
    }
}

     3.产品

       Meal类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Meal
    {
        protected List<Part> _parts = new List<Part>();
        public void AddPart(Part part)
        {
            _parts.Add(part);
        }
        public void Show()
        {
            foreach (Part part in _parts)
            {
                part.Show();
            }
        }
    }
}

     4.抽象建造者

        MealBuilder类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public abstract class MealBuilder
    {
        protected Meal _meal = new Meal();

        public abstract void BuildBurger();

        public abstract void BuildChips();

        public abstract void BuildDrink();

        public Meal GetMeal()
        {
            return _meal;
        }
    }
}

     5.具体建造者

       MealKFCBuilder类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MealKFCBuilder:MealBuilder
    {
        public override void BuildBurger()
        {
            _meal.AddPart(new KFCBurger());
        }
        public override void BuildChips()
        {
            _meal.AddPart(new KFCChips());
        }
        public override void BuildDrink()
        {
            _meal.AddPart(new KFCDrink());
        }
        
    }
}

       MealMCBuilder类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   public class MealMCBuilder:MealBuilder
    {
       public override void BuildBurger()
       {
           _meal.AddPart(new MCBurger());
       }
       public override void BuildChips()
       {
           _meal.AddPart(new MCChips());
       }
       public override void BuildDrink()
       {
           _meal.AddPart(new MCDrink());
       }
    }
}

       MealMixBuilder类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MealMixBuilder:MealBuilder
    {
        public override void BuildBurger()
        {
            _meal.AddPart(new KFCBurger());
        }
        public override void BuildChips()
        {
            _meal.AddPart(new MCChips());
        }
        public override void BuildDrink()
        {
            _meal.AddPart(new KFCDrink());
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MealMixBuilder:MealBuilder
    {
        public override void BuildBurger()
        {
            _meal.AddPart(new KFCBurger());
        }
        public override void BuildChips()
        {
            _meal.AddPart(new MCChips());
        }
        public override void BuildDrink()
        {
            _meal.AddPart(new KFCDrink());
        }
    }
}

     6.指挥者

        Mealdirector类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class MealDirector
    {
        private MealBuilder _builder;

        public MealDirector(MealBuilder builder)
        {
            _builder = builder;
 
        }
        public Meal CreateMeal()
        {
            _builder.BuildBurger();
            _builder.BuildChips();
            _builder.BuildDrink();
            return _builder.GetMeal();
        }
    }
}

        7.客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MealKFCBuilder kfcbuilder = new MealKFCBuilder();
            MealDirector kfcdirector = new MealDirector(kfcbuilder);
            Console.WriteLine("        菜单        ");
            Console.WriteLine("--------------------");
            kfcdirector.CreateMeal().Show();
            Console.WriteLine("--------------------");
            Console.WriteLine("");

            MealMCBuilder mcbuilder = new MealMCBuilder();
            MealDirector mcdirector = new MealDirector(mcbuilder);
            Console.WriteLine("        菜单        ");
            Console.WriteLine("--------------------");
            mcdirector.CreateMeal().Show();
            Console.WriteLine("--------------------");
            Console.WriteLine("");

            MealMixBuilder mixbuilder = new MealMixBuilder();
            MealDirector mixdirector = new MealDirector(mixbuilder);
            Console.WriteLine("        菜单        ");
            Console.WriteLine("--------------------");
            mixdirector.CreateMeal().Show();
            Console.WriteLine("--------------------");
            Console.WriteLine("");
            Console.Read();
            
        }
    }
}

运行结果:

 

体会与感悟:

       建造者模式:

       优点:将产品本身与产品的创建过程解耦。

                使用不同的建造者即可得到不同类型的产品。

                 增加新的产品类型只需要增加新的建造者,符合“开放--封闭原则”。

       缺点:如果产品之间的差异性很大,则不适合建造者模式。

                如果产品的内部变化复杂,可能会需要定义很多具体建造者类来适应这种变化,导致系统变得很庞大。

          

 

posted @ 2015-11-25 21:12  三日月宗近  阅读(370)  评论(0编辑  收藏  举报