`

Builder 模式

 
阅读更多

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

当一个复杂对象的创建需要很多步骤的时候,这些步骤在不同的条件下是变化的.通过不同的Builder创建'不同风格'的复杂对象.

为什么不用类本身的constructor呢,构造函数应该只是对本身的数据(state&data)进行初始化.

Builder的buildPart可以在ConcreteBuilder被override,不同的ConcreteBuilder的buildPart不同,从而

得到不同的product.

客户端代码通过使用不同ConcreteBuilder,得到不同规格的产品.

Builder builder = new ConcreteBuilder();//这个地方也可根据外部配置文件进行反射.
Director director = new Director( builder );
Product product = builder.getResult();

Builder 和Factory有什么区别呢,我们包Builder简化,去掉Director,发现其和简单Factory就一样了.

为什么有了Factory还要有Builder呢,客户端无非都是得到想要的product啊?不理解......,目前的理解是:

Builder:分步骤的,构建出一个复杂对象,这个复杂对象有很多parts,在不同的场景中,part可能不同.

e.g. 一座房子,有屋顶,门,天花板,地板.

房子A的屋顶是欧式的斜顶,门是木门,天花板也是木的,地板也是木的.

房子B的屋顶是平顶的水泥板,门是防盗门,天花板是吊顶的,地板是木的.

它们的组成过程一样,每一个parts不同.

Simple Factory:构建简单对象,在不同的场景中,这个对象的实现可能不一样.

e.g. 保存数据的一个类,都有save方法.

类A的save方法把数据保存到DB.

类B的save方法把数据保存到File.

客户端通过factory得到一个这种类的对象,不关心是类A还是类B,调用save就行了.

Abstract Factory:构建系列对象,对象间有关联,不同的场景关联不同.

有一个factory,创建两个不同的task,task1和task2.

factoryA创建的task1要在task2之前完成.

factoryB创建的task1要在task2之后完成.

(parts不同,更关注这个对象的组成,实现不同,更关注这个对象的行为.)

其实,客户端本来就不关心你用的是Builder,Factory,Abstract Factory,只有你保证客户端代码不用改就行了.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics