建造者模式是创建型模式,提供了一种创建对象的最佳方式。用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂的对象(把内部的建造过程和细节隐藏起来)。实现建造和表示分离,将复杂的产品建造步骤分解到不同的方法中,让创建过程更加的清晰。具体建造类之间是相互独立的,这有利于系统的扩展,增加新的具体建造者无需修改原有类库的代码,符合开闭的原则。
示例如下:
namespace Designmode.Builder
{
/// <summary>
/// 抽象建造者
/// </summary>
public abstract class Builder
{
/// <summary>
/// 建造A部分
/// </summary>
public abstract Builder buildPartA(string content);
/// <summary>
/// 建造B部分
/// </summary>
public abstract Builder buildPartB(string content);
/// <summary>
/// 建造C部分
/// </summary>
public abstract Builder buildPartC(string content);
/// <summary>
/// 返回建造结果
/// </summary>
public abstract Product GetReturn();
}
}
namespace Designmode.Builder
{
/// <summary>
/// 指挥构建工程,工程如何构建由它决定
/// </summary>
public class Director
{
/// <summary>
/// 指挥建造
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public Product Bulid(Builder builder)
{
builder.buildPartA("打地基");
builder.buildPartB("钢筋工程");
builder.buildPartC("铺电缆");
return builder.GetReturn();
}
}
}
namespace Designmode.Builder
{
/// <summary>
/// 产品
/// </summary>
public class Product
{
/// <summary>
/// 产品的A部分
/// </summary>
private string partA;
/// <summary>
/// 产品的B部分
/// </summary>
private string partB;
/// <summary>
/// 产品的C部分
/// </summary>
private string partC;
/// <summary>
/// 设置A部分
/// </summary>
/// <param name="partA">A内容</param>
public void SetPartA(string partA)
{
this.partA = partA;
}
/// <summary>
/// 设置B部分
/// </summary>
/// <param name="partB">B内容</param>
public void SetPartB(string partB)
{
this.partB = partB;
}
/// <summary>
/// 设置C部分
/// </summary>
/// <param name="partC">C内容</param>
public void SetPartC(string partC)
{
this.partC = partC;
}
/// <summary>
/// Tostring 重写
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"{this.partA} {this.partB} {this.partC}";
}
}
}
namespace Designmode.Builder
{
/// <summary>
/// 具体建造者(建造房子工人)
/// </summary>
public class Worker : Builder
{
/// <summary>
/// 由工人建造的产品
/// </summary>
private Product _product = null;
/// <summary>
/// 工人的构造函数
/// </summary>
public Worker()
{
_product = new Product();
}
/// <summary>
/// 工人建造的A部分
/// </summary>
public override Builder buildPartA(string content)
{
this._product.SetPartA(content);
return this;
}
/// <summary>
/// 工人建造的B部分
/// </summary>
public override Builder buildPartB(string content)
{
this._product.SetPartB(content);
return this;
}
/// <summary>
/// 工人建造的C部分
/// </summary>
public override Builder buildPartC(string content)
{
this._product.SetPartC(content);
return this;
}
/// <summary>
/// 返回工人建造的结果
/// </summary>
/// <returns>工人建造的产品</returns>
public override Product GetReturn()
{
return this._product;
}
}
}