深入解析C#设计模式编程中对建造者模式的运用

2019-12-26 18:00:47于丽

深入解析C#设计模式编程中对建造者模式的运用

 

建造者模式的分析
介绍完了建造者模式的具体实现之后,让我们总结下建造模式的实现要点:

在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。
产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。

.NET 中建造者模式的实现
  前面的设计模式在.NET类库中都有相应的实现,那在.NET 类库中,是否也存在建造者模式的实现呢? 然而对于疑问的答案是肯定的,在.NET 类库中,System.Text.StringBuilder(存在mscorlib.dll程序集中)就是一个建造者模式的实现。不过它的实现属于建造者模式的演化,此时的建造者模式没有指挥者角色和抽象建造者角色,StringBuilder类即扮演着具体建造者的角色,也同时扮演了指挥者和抽象建造者的角色,此时建造模式的实现如下:


/// <summary>
  /// 建造者模式的演变
  /// 省略了指挥者角色和抽象建造者角色
  /// 此时具体建造者角色扮演了指挥者和建造者两个角色
  /// </summary>
  public class Builder
  {
    // 具体建造者角色的代码
    private Product product = new Product();
    public void BuildPartA()
    {
      product.Add("PartA");
    }
    public void BuildPartB()
    {
      product.Add("PartB");
    }
    public Product GetProduct()
    {
      return product;
    }
    // 指挥者角色的代码
    public void Construct()
    {
      BuildPartA();
      BuildPartB();
    }
  }
  /// <summary>
  /// 产品类
  /// </summary>
  public class Product
  {
    // 产品组件集合
    private IList<string> parts = new List<string>();
    // 把单个组件添加到产品组件集合中
    public void Add(string part)
    {
      parts.Add(part);
    }
    public void Show()
    {
      Console.WriteLine("产品开始在组装.......");
      foreach (string part in parts)
      {
        Console.WriteLine("组件" + part + "已装好");
      }
      Console.WriteLine("产品组装完成");
    }
  }
  // 此时客户端也要做相应调整
  class Client
  {
    private static Builder builder;
    static void Main(string[] args)
    {
      builder = new Builder();
      builder.Construct();
      Product product = builder.GetProduct();
      product.Show();
      Console.Read();
    }
  }