一、建造者模式介绍:
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。建造者模式的本质是使组装过程和创建具体产品解耦。
二、情景例子:
还是以笔记本为例子,电脑店想进一批笔记本,采购员去到笔记本工厂里取货,笔记本具有很多配件例如CPU、内存、主板、电源等等,不可能是让采购员去到自己一个一个配件去装,工厂都是事先让工人们装好了一批又一批笔记本。这里就能够用到建造者模式去实现,将笔记本的每个配件的组装封装到一个建造者类中,建造者只需返回建造完成的产品对象就可以了。
三、相关代码:
1、创建产品类,包含产品配件的集合:
/// <summary>
/// 产品(笔记本)类
/// </summary>
public class NoteBook
{
//笔记本组件集合
private 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+"已装好!");
}
Console.WriteLine("笔记本组装完毕!");
}
}
2、创建建造者抽象父类,因为笔记本配件的安装过程是一致的:
/// <summary>
/// 建造者抽象父类
/// </summary>
public abstract class Builder
{
//装CPU
public abstract void BuildPartCPU();
//装内存
public abstract void BuildPartMemory();
//获得组装好的笔记本
public abstract NoteBook GetNoteBook();
}
3、创建建造者模式中的指挥者,指挥具体建造者组装笔记本:
/// <summary>
/// 指挥者类
/// </summary>
public class Commander
{
//组装笔记本
public void Construct(Builder builder)
{
builder.BuildPartCPU();
builder.BuildPartMemory();
}
}
4、创建具体建造者,重写抽象组装过程方法,区别只在于其组装的配件不同:
/// <summary>
/// 具体建造者类
/// </summary>
public class Worker1 : Builder
{
NoteBook notebook = new NoteBook();
public override void BuildPartCPU()
{
notebook.Add("i5-CPU");
}
public override void BuildPartMemory()
{
notebook.Add("4G-KingSton");
}
public override NoteBook GetNoteBook()
{
return notebook;
}
}
/// <summary>
/// 具体制造者类
/// </summary>
public class Worker2 : Builder
{
NoteBook notebook = new NoteBook();
public override void BuildPartCPU()
{
notebook.Add("i7-CPU");
}
public override void BuildPartMemory()
{
notebook.Add("8G-KingSton");
}
public override NoteBook GetNoteBook()
{
return notebook;
}
}
5、调用
Commander commander = new Commander();
//工人小明
Builder xiaoming = new Worker1();
//指挥者叫小明去组装笔记本
commander.Construct(xiaoming);
//小明装好了笔记本
NoteBook notebook1 = xiaoming.GetNoteBook();
notebook1.Show();
//工人小红
Builder xiaohong = new Worker2();
//指挥者叫小红去组装笔记本
commander.Construct(xiaohong);
//小红装好了笔记本
NoteBook notebook2 = xiaohong.GetNoteBook();
notebook2.Show();
Console.ReadKey();
四、总结:
建造模式的实现要点:
- 在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
- 建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的,也就是说笔记本的内部组件是经常变化的,如硬盘、CPU的产品性能等。
- 产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
- 抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
- 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。