点击打开链接1)生成器模式:将复杂对象的表示和创建进行分离。
抽象工厂和工厂模式,都是进行完成一个或是一系列的对象创建,如果是针对一个对象的创建较为复杂,需要多部分组装。
此时需要用建造者模式。
2)一个对象有多个部分进行构建,构建算法按需求变化,每一个构建模块相对稳定。
此时,生成器模式可以达到封装,让内部变化,而对外不影响。
3)构建图:
1、抽象生成器(builder):为创建一个Product对象的各个部件指定的抽象接口。
2、生成器具体实现
3、指导者
4、产品
5、客户端
代码案例:
其实,在现实场景中,有很多适用于生成器模式来解决的应用。比如Terrylee所描述的
KFC场景
,这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。 这些在不同的儿童餐中可以是不同的 ,但是 组合成儿童餐的过程是相同的 (这是关键点)。无论顾客点的是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争的餐馆中是同样的。在这样一种场景中,主食、辅食、饮料和玩具根据所选择的套餐种类的不同而不同,但是不管何种套餐,都具有这几大部分,也就是说组装的过程是一致的,不同的只是子部分的实现不同而已,但是这并不妨碍子部分的组装流程。这不完全符合生成器模式的适用场景吗?
在生成器模式中,我们不轻易改变的是面向客户的那一个Director ,而是来实现不同的ConcreteBuilder
比如儿童餐,有主食, 菜, 汤,玩具,那么在主食中,可以有米饭,馒头,菜品:蔬菜,红烧肉,汤:蛋花汤,等
这样就给出多个实现 ConcreteBuilder的实现,此时面向客户端的就不变了。
这里不进行扩展,客户端点不同的套餐的情况。仅仅是进行扩展固定的一个主食,一个菜品,一个汤的情况!
总结: 对象的表示也可以抽象为总体的行为。或是创建也可以抽象成表示。也就是将复杂对象的行为分层,或表示分层。
行为 就是表示! 将复杂对象分层创建。
参考:点击打开链接