5.建造者模式

1.定义

Seperate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分享,使得同样的构建过程可以创建不同的表示。)

2.模式说明

5.建造者模式

Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法。

Builder抽象建造者:规范产品的组建,一般由子类实现。

ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组建好的对象。

Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造。

3.通用代码

 1     /// <summary>

 2     /// 产品类

 3     /// </summary>

 4     public class Product

 5     {

 6         public void DoSomeThing()

 7         {

 8         }

 9     }

10 

11     /// <summary>

12     /// 抽象构建者

13     /// </summary>

14     public abstract class AbstractBuilder

15     {

16         /// <summary>

17         /// 设置产品的不同部分,以获得不同的产品

18         /// </summary>

19         public abstract void SetPart();

20 

21         /// <summary>

22         /// 建造产品

23         /// </summary>

24         /// <returns></returns>

25         public abstract Product BuildProduct();

26     }

27 

28     /// <summary>

29     /// 构建者

30     /// </summary>

31     public class ConcreteProduct : AbstractBuilder

32     {

33         private readonly Product _product = new Product();  

34 

35         /// <summary>

36         /// 设置产品零件

37         /// </summary>

38         public override void SetPart()

39         {

40         }

41 

42         /// <summary>

43         /// 建造产品

44         /// </summary>

45         /// <returns></returns>

46         public override Product BuildProduct()

47         {

48             return _product;

49         }

50     }

51 

52     /// <summary>

53     /// 导演类

54     /// </summary>

55     public class Director

56     {

57         public Product GetAProduct()

58         {

59             AbstractBuilder builder = new ConcreteProduct();

60 

61             builder.SetPart();

62 

63             return builder.BuildProduct();

64         }

65     }

4.具体实例

namespace ConsoleApplication1

{

    /// <summary>

    /// 产品类

    /// </summary>

    public class 套餐

    {

        readonly Hashtable _food = new Hashtable();



        /// <summary>

        /// 添加食品

        /// </summary>

        /// <param name="strName">食品名称</param>

        /// <param name="price">价格</param>

        public void Add(string strName, string price)

        {

            _food.Add(strName, price);

        }



        /// <summary>

        /// 显示食品清单

        /// </summary>

        public void Show()

        {

            IDictionaryEnumerator myEnumerator = _food.GetEnumerator();

            Console.WriteLine("Food List:");

            Console.WriteLine("------------------------------");

            string strfoodlist = "";

            while (myEnumerator.MoveNext())

            {

                strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key;

                strfoodlist = strfoodlist + ":\t" + myEnumerator.Value;

            }

            Console.WriteLine(strfoodlist);

            Console.WriteLine("\n------------------------------");

        }

    }



    /// <summary>

    /// 抽象构建者

    /// </summary>

    public abstract class AbstractBuilder

    {

        /// <summary>

        /// 设置产品的不同部分,以获得不同的产品

        /// </summary>

        public abstract void SetPart(string strName, string price);



        /// <summary>

        /// 建造产品

        /// </summary>

        /// <returns></returns>

        public abstract 套餐 BuildProduct();

    }



    /// <summary>

    /// 抽象构建者

    /// </summary>

    public class 套餐Builder : AbstractBuilder

    {

        private readonly 套餐 _product = new 套餐();



        /// <summary>

        /// 设置产品零件

        /// </summary>

        public override void SetPart(string strName, string price)

        {

            _product.Add(strName,price);

        }



        /// <summary>

        /// 建造产品

        /// </summary>

        /// <returns></returns>

        public override 套餐 BuildProduct()

        {

            return _product;

        }

    }



    /// <summary>

    /// 导演类

    /// </summary>

    public class Director

    {

        public 套餐 Get豪华套餐()

        {

            AbstractBuilder builder = new 套餐Builder();



            builder.SetPart("可乐","10");



            builder.SetPart("鸡翅", "12");



            builder.SetPart("汉堡", "15");



            builder.SetPart("冰淇淋", "10");



            builder.SetPart("署条", "10");



            return builder.BuildProduct();

        }



        public 套餐 Get普通套餐()

        {

            AbstractBuilder builder = new 套餐Builder();



            builder.SetPart("可乐", "10");



            builder.SetPart("汉堡", "15");



            builder.SetPart("署条", "10");



            return builder.BuildProduct();

        }

    }



    class Program

    {

        static void Main(string[] args)

        {

            var director = new Director();



            套餐 豪华套餐 = director.Get豪华套餐();



            豪华套餐.Show();



            套餐 普通套餐 = director.Get普通套餐();



            普通套餐.Show();



            Console.ReadKey();

        }

    }

}

5.优点

(1)封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节。

(2)扩展方便:如上例所示,可以很方便的添加一个名为"商务套餐"的产品。

6.使用场景

(1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用此模式。

(3)产品类非常复杂,或者产品类中的调用顺序不同产生不同的效能,这个时候可以使用此模式。

7.说明

建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的效能也不同。也工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它所要关心的。

 

你可能感兴趣的:(建造者模式)