概要
建造者模式适用于通过多个简单对象经过多个步骤创造出复杂对象的过程。与抽象工厂不同的是,抽象工厂模式适用于创建一个产品族下的产品,例如华为的手机、电脑等等,而建造者模式相当于一个手机加工厂(通过各个组件组装成手机的过程)。建造者的目的就是将对象的构建和表示分离,使相同的构建过程可以得到不同的结果。
结构
建造者(Builder)模式包含如下角色:
-
抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
-
具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
-
产品类(Product):要创建的复杂对象。
-
指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
代码展示
// 电脑类(为模拟场景,这里只以GPU和CPU为电脑组件) 此处的电脑类即为产品类
public class Computer {
private String CPU;
private String GPU;
public String getGPU() {
return GPU;
}
public void setGPU(String GPU) {
this.GPU = GPU;
}
public String getCPU() {
return CPU;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
}
// 此处的bulider即为抽象建造者类
public abstract class Builder {
protected Computer nComputer = new Computer();
public abstract void buildCPU();
public abstract void buildGPU();
public abstract Computer createComputer();
}
// 华为电脑Builder类 此处为实际的建造者
public class HuaweiComputerBuilder extends Builder {
@Override
public void buildGPU() {
nComputer.setGPU("4060");
}
@Override
public void buildCPU() {
nComputer.setCPU("10850K");
}
@Override
public Computer createComputer() {
return nComputer;
}
}
// 三星电脑Builder类 此处为实际的建造者
public class SamsungComputerBuilder extends Builder {
@Override
public void buildGPU() {
nComputer.setGPU("4050");
}
@Override
public void buildCPU() {
nComputer.setCPU("10900K");
}
@Override
public Computer createComputer() {
return nComputer;
}
}
// 指挥者类(有时会简化操作将指挥者和抽象建造者结合)
public class Director {
private Builder builder;
// 指挥者这里可传入的builder即可以是huawei也可以是Samsung,对应创建不同的电脑
public Director(Builder builder) {
builder = builder;
}
public Computer construct() {
builder.buildGPU();
builder.buildCPU();
return builder.createComputer();
}
}
//测试类
public class Main {
public static void main(String[] args) {
Director huaweiDirector = new Director(new HuaweiComputerBuilder());
Computer huaweiComputer = huaweiDirector.construct();
Director SamsungDirector = new Director(new SamsungComputerBuilder());
Computer SamsungComputer = SamsungDirector.construct();
System.out.println(huaweiComputer.getCPU());
System.out.println(SamsungComputer.getCPU());
}
}
优点:
- 将产品本身和产品的创建过程解耦,使得几乎相同的创建过程能创建出不同的产品对象。
- 产品中每一个组件种类都是可控的。
- 如果有新的产品创建需求,完全不用修改原有的代码,添加一个新的创建者类就可以完成。
缺点:
- 建造者模式构建的产品具有很大的相同点,几乎拥有相同的组成部分和创建顺序,如果产品之间的差异很大,则不适用于建造者模式。
使用场景
根据创建者模式的优缺点,我们可以得出创建者模式适用于创建所需组件大致相同但组件种类可有不同、并且建造过程和产品本身解耦的复杂对象。