建造者设计模式
- 引言
在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。然而现实生活中也是如此的,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。下面就以这个例子来展开建造者模式的介绍。 - 分析
(1)、抽象建造者角色(Builder):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
(2)、具体建造者(AssBuilder1)
1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。
2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建
3) 提供一个检索产品的接口
4) 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例
(3)、指导者(Conductorer):调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。
(4)、产品角色(Computer):建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
- 具体的代码
namespace DesignPattern
{
/* 建造者设计模式
* 1.指挥者
* 2.抽象的建造者
* 3.具体的建造者
* 4.产品角色
* 组装电脑,有CPU,主版,硬盘,显卡等
*/
/// <summary>
/// 电脑类【产品角色】
/// </summary>
public class Computer
{
//电脑组件集合
private List<string> assemblyList = new List<string>();
public void Add(string assembly)
{
assemblyList.Add(assembly);
}
public void Show()
{
Console.WriteLine("电脑开始组装........");
foreach (var assembly in assemblyList)
{
Console.WriteLine("组件" + assembly + "已经安装好");
}
Console.WriteLine("电脑组装好了");
}
}
/// <summary>
/// 抽象组装者【抽象的建造者】
/// </summary>
public abstract class Builder
{
//组装CPU
public abstract void BuilderAssCPU();
//组装主板
public abstract void BuilderAssBoard();
//获得组装好的电脑
public abstract Computer GetComputer();
}
/// <summary>
/// 组装者1【具体的建造者】
/// </summary>
public class AssBuilder1 : Builder
{
Computer computer = new Computer();
public override void BuilderAssBoard()
{
computer.Add(" Board1 ");
}
public override void BuilderAssCPU()
{
computer.Add(" CPU1 ");
}
public override Computer GetComputer()
{
return computer;
}
}
/// <summary>
/// 组装者2【具体的建造者】
/// </summary>
public class AssBuilder2 : Builder
{
Computer computer = new Computer();
public override void BuilderAssBoard()
{
computer.Add(" Board2 ");
}
public override void BuilderAssCPU()
{
computer.Add(" CPU2 ");
}
public override Computer GetComputer()
{
return computer;
}
}
/// <summary>
/// 指挥者【指挥者】
/// </summary>
public class Conductorer
{
public void Conductor(Builder builder)
{
builder.BuilderAssBoard();
builder.BuilderAssCPU();
}
}
/// <summary>
/// 实现
/// </summary>
public class BuilderMode
{
public static void Main(string[] args)
{
Conductorer con = new Conductorer();
Builder builder1 = new AssBuilder1();
Builder builder2 = new AssBuilder2();
con.Conductor(builder1);
con.Conductor(builder2);
Computer com1 = builder1.GetComputer();
com1.Show();
Computer com2 = builder2.GetComputer();
com2.Show();
Console.ReadKey();
}
}
}
4 优缺点:
优点: 将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式的本质是使组装过程(用指挥者类进行封装,从而达到 解耦的目的)和创建具体产品解耦,使我们不用去关心每个组件是如何组装的。