将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
简述
建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需知道建造者的类型即可。
模式结构
- Builder(抽象建造者):抽象建造者为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),用于返回复杂对象。它可以使抽象类,还可以是接口。
- ConcreteBuilder(具体建造者):实现Builder接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的地复杂产品对象。
- Product(产品角色):产品角色是被构建的复杂对象吧,包含多个组成部件,具体建造者创建该产品的内部表示并定义他的装配过程。
- Director(指挥者):负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构建与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象,然后通过指挥者类的构造函数或者set方法将该对象传入指挥者类中。
客户端代码片段
Builder builder= new ConcreteBuilder();
Director director=new Director(builder);
Product producter=director.construct();
优缺点
优点
- 客户端不必知道内部细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的的产品对象。
- 每一个具体建造者都相对独立,与其他的的具体建造者无关,因此恨意很容易增加新的建造者。
- 可以更加精细的控制产品的创建过程
- 增加新的建造者无需修改原有代码,指挥者类针对抽象层编程。系统扩展方便。
缺点
- 所创建的产品一般具有较多的共同点,组成部分相似,如果产品差异很大,则不适用。
- 如果产品内部变化很复杂,可能会导致需要定义很多具体建造者来实现这种变化,导致系统很庞大。