定义
官方定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品
特点
建造者模式是一种创建型模式,适用于那些流程固定,建造的目标对象会有所改变这种场景,还有一种场景是代替多参数构造器
作用
1、用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」
2、用户只需给出复杂对象的内容和类型可以创建出对象
结构
Builder 接口或抽象类 抽象的建造者, 不是必须的
ConcreateBuilder 具体的构建者 可以有多个
Product 普通的类 被构建的对象
Director 指挥者 统一指挥构造者去建造目标
组装Android 手机为例
1、要建造的对象 AndroidPhone
public class AndroidPhone {
private int emmcSize;
private String cup;
public void setCup(String cup) {
this.cup = cup;
}
public void setEmmcSize(int emmcSize) {
this.emmcSize = emmcSize;
}
}
2、抽象的建造者 Builder
public interface Builder {
void setCup(String cup);
void setEmmcSize(int size);
AndroidPhone createPhone() ;
}
3、具体建造者 AssemblerBuilder
public class AssembleBuilder implements Builder{
private AndroidPhone androidPhone = new AndroidPhone();
@Override
public void setCup(String cup) {
androidPhone.setCup(cup);
}
@Override
public void setEmmcSize(int size) {
androidPhone.setEmmcSize(size);
}
@Override
public AndroidPhone createPhone() {
return androidPhone;
}
}
4、指挥者 Director
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public AndroidPhone createPhone(String cup, int size) {
mBuilder.setCup(cup);
mBuilder.setEmmcSize(size);
return mBuilder.createPhone();
}
}
5、测试类
public static void main(String[] args) {
Builder builder = new AssembleBuilder();
AndroidPhone androidPhone = new Director(builder).createPhone("mst618", 2048);
}
使用场景
1、如果一个对象有非常复杂的内部结构「这些产品通常有很多属性」,那么使用建造者模式
2、如果想把复杂对象的创建和使用分离开来,那么使用建造者模式「使用相同的创建步骤可以创建不同的产品」
建造者模式与简单工厂模式的差异
1、创建对象的粒度不同
工厂模式创建的是对象,而建造者模式创建的是一个复合产品,由各个复杂的部件组成。
2、关注点不同:
工厂模式注重只要把这个对象创建出来,而建造者模式不似要创造出这个产品,还有知道这个产品的组成部分