定义

  1. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  2. 主要解决的问题是:构建对象的过程中,部分步骤灵活多变无法固定,需要根据需求组合

使用场景

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
  2. 相同的方法,不同的执行顺序,产生不同的事件结果时
  3. 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不同时
  4. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临者复杂的变化

代码实现

public class Product
{
   IList<string> parts = new List<string>();
    
   public void Add(string part)
   {
       parts.Add(part);
   }

   public void Show()
   {
       Console.WriteLine("产品组成");
       foreach(var item in parts)
       {
             Console.WriteLine(item);
       }
   }
}

abstract class Builder
{
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetResult();
}

class ConcreteBuilder1: Builder
{
    private Product product = new Product();
    public override void BuilderPartA()
    {
          product.Add("部件1A");    
    }

    public override void BuilderPartB()
    {
         prodcut.Add("部件1B");
    }
    
    public Product GetResult()
    {
        return product;
    }

}

class ConcreteBuilder2: Builder
{
    private Product product = new Product();
    public override void BuilderPartA()
    {
          product.Add("部件2A");    
    }

    public override void BuilderPartB()
    {
         prodcut.Add("部件2B");
    }
    
    public Product GetResult()
    {
        return product;
    }

}

class Director
{
      public void Construct(Builder builder)
      {
            builder.BuilderPartA();
            builder.BuilderPartB();
      }
}


void Main()
{
    Director director = new Director();
    Builder builder1 = new ConcreteBuilder1();
    director.Construct(builder1);
    Product product1 = builder1.GetResult();
    product1.Show();
}

优点

  1. 使用建造者模式可以使客户端不必知道产品内部组成的细节
  2. 具体的建造者类之间是相互独立的,容易扩展
  3. 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响

缺点

  1. 产生多余的builder对象以及Director类