建造模式可以将一个产品的内部表象与产品的生成过程分割开,从而使一个生成过程创建具有不同内部表象的对象;
角色
抽象建(builder)造者,具体建(concrete builder)造者,导演者(director)角色,产品(product)角色;
客户端与导演者打交道,导演者调用具体建造者;每有一个产品类就有一个具体的建造者类;
导演需要演员(具体建造者),具体建造者对应了某一个具体产品;
具体产品可以使用一个接口,方便将获得产品的方法提到抽象创建者中,也可以不这么做;
什么时候使用
- 需要生成的产品对象有复杂的内部结构;
- 需要生成的产品对象的属性相互依赖()建造模式可以强制分步骤执行,如果属性的赋值有先后顺序;
- 创建对象的过程中用到系统的其他对象,这些对象在产品对象的创建过程中不易得到;
好处:使得产品内部的表象可以独立的变化,客户端不需要做知道细节,每一个builder相互独立,最终产品易于控制;
建造模式与抽象工厂模式区别
他们非常相像,都用来创建属于几个产品族的对象;
抽象工厂模式每一次工厂对象被调用时都会创建一个完整的产品对象,而客户端有可能会把这个产品组装成更复杂的产品,也有可能不会。建造类不同,它一点一点建造出一个复杂的产品,这个产品的组装过程就发生在建造者内部。建造者模式客户端拿到的是完整的最后的产品;
建造者模式与策略模式
建造者模式在结果上很接近策略模式,是策略模式的一种特殊情况,但是它们用意不同,建造者模式一点一点建造新的对象,具体建造者模式虽然有相同的接口但是所创建出来的对象可能完全不同;
策略模式是为算法提供抽象的接口,一个具体策略类把一个算法包装到一个对象里,不同的具体策略对象为一种一般性的服务提供不同的实现;
建造模式过渡到模板模式
建造模式在退化失去导演角色以后可以发展到模板方法模式;
使用缺省适配模式
某个产品没有某个实现,那么此产品对应的具体建造类就无法实现对应那个零件的建造方法。这时可以使用缺省适配模式,提供一个建造方法的平庸实现。也就是不产生具体建造行为的实现;
建造模式与合成模式
产品的零件可以是对象可以不是对象,而是对象的某种组成成分,当产品的零件是对象时,产品对象就变成了复合对象,这种对象内含有子对象的结构,可以使用合成模式;