1.什么是创建者模式?在什么时候使用?
当我们要创建一个复杂的系统,并且这种系统由着特定的复杂的步骤组合而成,我们要怎么办?就像老板要你去采购一批电脑,电脑的配置各有所不同,品牌也不同,而电脑由不同的部件组成,主板,内存,显示器,机箱等组成,而你不肯能一个一个零件的去采购,然后在来组装,这时候,我们就需要去找电脑城的老板,去找不同品牌的老板,让老板来给你组装好成品的电脑,你只需要付钱就可以拿到不同的电脑,这就是一个常见的创建者模式,老板就充当了Builder,从每个老板那儿拿到不同的配置,不同品牌的电脑。好,我们来实现这个简单的模式?
2.我们来实现这个系统
我们来实现电脑Class - Computer
/// <summary>
/// 创建者模式
/// </summary>
public class Computer
{
private IList<string> parts = new List<string>();
//把单个组件添加到电脑组合中
public void Add(string part)
{
parts.Add (part);
}
public void Show()
{
Debug.Log ("电脑开始组装");
foreach(string patrs in parts)
{
Debug.Log ("组件名称:" + parts +"已经组装好");
}
Debug.Log (" 电脑组装结束");
}
}
我们来实现一个抽象的接口class-Builder/// <summary>
/// 电脑的组装着
/// </summary>
public abstract class Builder
{
//装CPU
public abstract void BuilderPartCPU ();
//装主板
public abstract void BuildMainBoard();
//获得组装好的电脑
public abstract Computer getComputer();
}
我们在来实现两个创建者 class - ConcreateBuilder1/// <summary>
/// 具体的创建者
/// </summary>
public class ConcreateBuilder1 : Builder
{
Computer computer = new Computer();
public override void BuilderPartCPU()
{
computer.Add ("CPU1");
}
public override void BuildMainBoard()
{
computer.Add ("Main board1");
}
public override Computer getComputer ()
{
return computer;
}
}
/// <summary>
/// 具体的创建者2
/// </summary>
public class ConcreateBuilder2 : Builder
{
Computer computer = new Computer();
public override void BuilderPartCPU()
{
computer.Add ("CPU2");
}
public override void BuildMainBoard()
{
computer.Add ("Main board2");
}
public override Computer getComputer ()
{
return computer;
}
}
我们来实现一个导演类,也就是古代打仗的时候的将军,他负责指挥整个战斗的进行。
public class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartCPU ();
builder.BuildMainBoard ();
}
}
我们来测试
public class Customer
{
public void MainTest()
{
Builder builder1 = new ConcreateBuilder1 ();
Builder builder2 = new ConcreateBuilder2 ();
Director direct = new Director ();
//老板让第一个人去组装电脑
direct.Construct (builder1);
Computer comp1 = builder1.getComputer ();
comp1.Show ();
//老板让第二个人去组装电脑
direct.Construct(builder2);
Computer comp2 = builder2.getComputer ();
comp2.Show ();
}
}
3。我们来说说他的特点。
(1)指挥者直接与客户打交道,而客户也丝毫不用关系产品的构造过程,指挥者把客户的请求委托给每一个创建者。
(2)建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等
(3)产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类
(4)在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化
(5 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。