5.建造者模式

1.定义

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

2.模式说明

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 + "

" + myEnumerator.Key;
                strfoodlist = strfoodlist + ":	" + myEnumerator.Value;
            }
            Console.WriteLine(strfoodlist);
            Console.WriteLine("
------------------------------");
        }
    }

    /// <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.说明

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

原文地址:https://www.cnblogs.com/JustYong/p/4612739.html