定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
那什么是将一个复杂对象的构造与表示分离呢?下面将举一个例子说明。
传说中,我们人类是由女娲创造的,通过拼凑头、身体、手、脚等部位完成,于是有了以下的程序:
public class Godness
{
public void BuildPeople()
{
Console.WriteLine("建造头");
Console.WriteLine("建造身体");
Console.WriteLine("建造手");
Console.WriteLine("建造脚");
Console.WriteLine("得到人");
}
}
但是女娲觉得还不满意,觉得需要分为男人和女人,于是有了以下的程序:
public class Godness
{
public void BuildMen()
{
Console.WriteLine("建造头");
Console.WriteLine("建造男人身体");
Console.WriteLine("建造手");
Console.WriteLine("建造脚");
Console.WriteLine("得到男人");
}
public void BuildWomen()
{
Console.WriteLine("建造头");
Console.WriteLine("建造女人身体");
Console.WriteLine("建造手");
Console.WriteLine("建造脚");
Console.WriteLine("得到女人");
}
}
但是女娲觉得还是不满意,得区别高矮胖瘦,这样就不得不继续修改原本的程序,这就违背了开闭原则。
其实不难发现,以上不论男人,女人,胖子,瘦子,都具备同样的创造过程,把头部,身体,手,脚创造出来然后拼凑完成。
这种具有相同的构造过程,而具体每个部分细节不同的需求,就可以用建造者模式来完成了。
于是有了以下程序:
//具体人
public class People
{
}
/// <summary>
/// 建造指挥者
/// </summary>
public class GodDirector
{
public People Construct(IPeopleBuilder builder)
{
builder.BuildHead();
builder.BuildBody();
builder.BuildHand();
builder.BuildLeg();
return builder.GetResult();
}
}
/// <summary>
/// 人类建造过程 这里就是指前面定义里的构造
/// </summary>
public abstract class IPeopleBuilder
{
protected People people = new People();
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildHand();
public abstract void BuildLeg();
public abstract People GetResult();
}
//Men.cs 男人建造表达 指定义里面的表示
public class Men : IPeopleBuilder
{
public override void BuildBody()
{
Console.WriteLine("建造男人的身体");
}
public override void BuildHand()
{
Console.WriteLine("建造男人的手");
}
public override void BuildHead()
{
Console.WriteLine("建造男人的头");
}
public override void BuildLeg()
{
Console.WriteLine("建造男人的腿");
}
public override People GetResult()
{
Console.WriteLine("得到男人");
return people;
}
}
//Women.cs
public class Women : IPeopleBuilder
{
public override void BuildBody()
{
Console.WriteLine("建造女人的身体");
}
public override void BuildHand()
{
Console.WriteLine("建造女人的手");
}
public override void BuildHead()
{
Console.WriteLine("建造女人的头");
}
public override void BuildLeg()
{
Console.WriteLine("建造女人的腿");
}
public override People GetResult()
{
Console.WriteLine("得到女人");
return people;
}
}
static void Main(string[] args)
{
GodDirector god = new GodDirector();
god.Construct(new Men());
Console.WriteLine("");
god.Construct(new Women());
Console.ReadLine();
}
这里就能根据不同的建造者实现相同的构造过程,如果以后需要增加其他什么动物,也有头身体手腿什么的,就不用修改原本的建造过程,直接新建一个脚本,然后实现抽象类就可以完成。
具体UML图():
回到目录 上一篇 下一篇