建造者模式(Builder Pattern)
使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式更加关注与零件装配的顺序。
产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
优点:
建造者独立,易扩展。 便于控制细节风险。
建造者模式将复杂对象的创建与客户端进行分离,降低了两者间的耦合度。
其本质上是将复杂对象的创建过程与具体产品表现间的解耦。
缺点:
产品必须有共同点,范围有限制。
如内部变化复杂,会有很多的建造类。
具体产品:
/// <summary>
/// 电脑类
/// </summary>
public class Computer
{
private List<string> parts = new List<string>();//电脑组件集合
public void AddParts(string part)
{
parts.Add(part);
}
public void Show()
{
Debug.Log("电脑配件:");
foreach (string part in parts)
{
Debug.Log("已经组装了:" + part);
}
}
}
抽象建造者:
/// <summary>
/// 组装电脑的方案接口
/// </summary>
public interface I_Builder
{
void Build_MainBoard();//主板
void Build_CPU();//CPU
void Build_GPU();//GPU
/// <summary>
/// 最后获得一台组装好的电脑,返回一台电脑
/// </summary>
Computer GetComputer();
}
具体建造者:
/// <summary>
/// 电脑组装方案1
/// </summary>
public class ConcreteBuilder_1 : I_Builder
{
Computer computer = new Computer();//新建一台电脑
public void Build_MainBoard()
{
computer.AddParts("组装主板_1");
}
public void Build_CPU()
{
computer.AddParts("组装CPU_1");
}
public void Build_GPU()
{
computer.AddParts("组装GPU_1");
}
public Computer GetComputer()
{
return computer;
}
}
/// <summary>
/// 电脑组装方案2
/// </summary>
public class ConcreteBuilder_2 : I_Builder
{
Computer computer = new Computer();//新建一台电脑
public void Build_MainBoard()
{
computer.AddParts("组装主板_2");
}
public void Build_CPU()
{
computer.AddParts("组装CPU_2");
}
public void Build_GPU()
{
computer.AddParts("组装GPU_2");
}
public Computer GetComputer()
{
return computer;
}
}
指挥者:
/// <summary>
/// 指挥者
/// </summary>
public class Director
{
/// <summary>
/// 组装电脑的建造步骤
/// </summary>
/// <param name="builder"></param>
public void Construct(I_Builder builder)
{
builder.Build_MainBoard();
builder.Build_CPU();
builder.Build_GPU();
}
}
运行测试:
void Start()
{
Director director = new Director();//新建指挥者
I_Builder builder_1 = new ConcreteBuilder_1();//新建方案1
I_Builder builder_2 = new ConcreteBuilder_2();//新建方案2
director.Construct(builder_1);//指挥者获取方案1去组装一台电脑
Computer computer_1 = builder_1.GetComputer();//获得组装好的电脑1
computer_1.Show();
Debug.Log("==================================================");
director.Construct(builder_2);//指挥者获取方案2去组装一台电脑
Computer computer_2 = builder_2.GetComputer();//获得组装好的电脑2
computer_2.Show();
}
结果: