转载

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

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

正文到此结束
Loading...