盘古开辟了天地,用身躯造出日月星辰、山川草木。那残留在天地间的浊气慢慢化作虫鱼鸟兽,为这寂静的世界增添了生气。这时,有一位女神女娲,在这莽莽的原野上行走。她放眼四望,山岭起伏,江河奔流,丛林茂密,草木争辉,天上百鸟飞鸣,地上群兽奔驰,水中鱼儿嬉戏,草中虫之豸跳跃,这世界按说也点缀得相当美丽了。但是她总觉得有一种说不出的寂寞,越看越烦,孤寂感越来越强烈,连自己也弄不清楚这是为什么。与山川草木诉说心中的烦躁,山川草木根本不懂她的话;对虫鱼鸟兽倾吐心事,虫鱼鸟兽哪能了解她的苦恼。
她颓然坐在一个池塘旁边,茫然对池塘中自己的影子。忽然一片树叶飘落池中,静止的池水泛起了小小的涟漪,使她的影子也微微晃动起来。她突然觉得心头的结解开了,是呀!为什么她会有那种说不出的孤寂感?原来是世界是缺少一种像她一样的生物。想到这儿,她马上用手在池边挖了些泥土,和上水,照着自己的影子捏了起来。捏着捏着,捏成了一个小小的东西,模样与女娲差不多,也有五官七窍,双手两脚。捏好后往地上一放,居然活了起来。女娲一见,满心欢喜,接着又捏了许多。她把这些小东西叫作“人”。今天我们的大话设计就从女娲抟土造人的故事开始说起,女娲要建造一个人,那首先要造头,身体,胳膊和腿,这就关乎到一个制造工序的问题,不知道读者有没有这样的感觉,建造者模式和工程模式很接近,但是建造者模式提供了一个更加细粒度的对象的建造过程,我们先来看一下,建造者模式的结构图:
![](https://box.kancloud.cn/2015-12-30_56837439cd31e.jpg)
依然以我们上述的女娲抟土造人为例,看看我们的代码,首先,女娲要先创建一个需要建造的对象,如下:
~~~
//要构造的对象
public class Robust
{
String head;
String body;
String arm;
String leg;
public String getHead()
{
return head;
}
public void setHead(String head)
{
this.head = head;
}
public String getBody()
{
return body;
}
public void setBody(String body)
{
this.body = body;
}
public String getArm()
{
return arm;
}
public void setarm(String arm)
{
this.arm = arm;
}
public String getLeg()
{
return leg;
}
public void setLeg(String leg)
{
this.leg = leg;
}
}
~~~
然后有一个构造者的接口,其中包括了建造者会使用的建造过程
~~~
public interface Builder
{
public void buidBody(String body);
public void buidHead(String head);
public void buidArm(String arm);
public void buidLeg(String leg);
public Robust getRobust();
}
public class RobustBuilder implements Builder
{
Robust robust = new Robust();
public void buidBody(String body)
{
robust.setBody(body);
}
public void buidHead(String head)
{
robust.setHead(head);
}
public void buidArm(String arm)
{
robust.setArm(arm);
}
public void buidLeg(String leg)
{
robust.setLeg(leg);
}
public Robust getRobust()
{
return robust;
}
}
~~~
有了建造者之后,需要有一个指挥家来指示建造的过程:
~~~
//指挥建造的类
public class Director
{
public Robust Construct(Builder builder)
{
builder.buidBody(null);
builder.buidHead(null);
builder.buidArm(null);
builder.buidLeg(null);
return builder.getRobust();
}
}
~~~
这样,女王抟土造人的过程就完成了,从代码角度来说, 如果我们希望分离复杂类型构建规则和类型内部组成,或者希望把相同的构建过程用于构建不同类型的时候可以考虑使用建造者模式。从应用角度来说, 如果我们希望解耦产品的创建过程和产品的具体配件,或者我们希望为所有产品的创建复用一套稳定并且复杂的逻辑的时候可以考虑使用建造者模式。设计之旅,未完待续......