设计模式-建造者模式-创建型模式


介绍完工厂模式,现在来看一下建造者模式。建造者模式就是将一系列对象组装为一个完整对象并且返回给用户,例如汽车,就是需要由各个部件来由工人建造成一个复杂的组合实体,这个复杂实体的构造过程就被外部化到一个建造者的对象,由这个建造者对象返回创建好的实体,是不是跟工厂很像呀?
建造者模式则主要由几个对象构成:

  • 抽象建造者
  • 具体建造者
  • 指挥者
  • 产品角色

UML 类图如下:
UML 类图
抽象建造者负责定义建造者的行为,这里使用接口/抽象类均可,而具体建造者则实现了抽象建造者,负责具体的建造行为。
指挥者是针对抽象建造者进行变成,是将这些建造者的建造行为进行逻辑处理,不论你传入哪种不同的建造者,都能保证建造流程一致性。
而建造者模式则是将构造复杂对象的内部与对象的具体表现隔离开来,使得同样的建造过程可以创造出不同的表现。
上代码:

// 抽象建造者
public abstract class AbsBuilder
{
    public abstract void AddHead();
    public abstract void AddBody();
    public abstract void AddFoot();
    public abstract Product GetResult();
}
// 抽象产品
public abstract class Product
{
    public abstract void Show();
}
// 字符串产品 A
public class ProductA : Product
{
    public string Content {get; set;}
    public override void Show()
    {
        Console.WriteLine(Content);
    }
}
// 整形产品 B
public class ProductB : Product
{
    public int Content {get; set;}
    public override void Show()
    {
        Console.WriteLine(Content);
    }
}
// 建造者 A,负责构建字符串产品
public class BuilderA : AbsBuilder
{
    private ProductA _product = new ProductA();
    public override void AddHead()
    {
        _product.Content += "This is Head\r\n";
    }
    public override void AddBody()
    {
        _product.Content += "This is Body\r\n";
    }
    public override void AddFoot()
    {
        _product.Content += "This is Foot\r\n";
    }
    public override Product GetResult()
    {
        return _product;
    }
}
// 建造者 B,负责构建整形产品
public class BuilderB : AbsBuilder
{
    private ProductB _product = new ProductB();
    public override void AddHead()
    {
        _product.Content += 1;
    }
    public override void AddBody()
    {
        _product.Content += 10;
    }
    public override void AddFoot()
    {
        _product.Content += 11;
    }
    public override Product GetResult()
    {
        return _product;
    }
}
// 指挥者
public class Director
{
    public Product Construct(AbsBuilder builder)
    {
        builder.AddHead();
        builder.AddBody();
        builder.AddFoot();
        return builder.GetResult();
    }
}
public class Program
{
    public static Main()
    {
        var director = new Director();
        var product = director.Construct(new BuilderA());
        var productB = director.Construct(new BuilderB());
        product.Show();
        productB.Show();
    }
}

建造者模式如果需要新增一个建造者的话十分方便,符合开闭原则,只需要编写一个实现了抽象类的建造者即可,十分方便扩展。
而且对于复杂的对象的构建过程可以在具体的建造者内部进行精细化控制。

  • 适用于需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序;
  • 独立于创建该对象的类;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品。