将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
当一个复杂对象的创建需要很多步骤的时候,这些步骤在不同的条件下是变化的.通过不同的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,只有你保证客户端代码不用改就行了.