定义
隐藏创建对象的建造过程,使得用户在不知对象的建造过程的情况下,就可直接创建复杂的对象。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
- 用户只需要给出指定复杂对象的类型和内容;
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
四个角色
- 产品(product):要创建的产品
- 指挥者(Director):直接和客户进行需求沟通,明白需要创建什么样的产品
- 抽象建造者(Builder):指挥者将客户对产品的需求划分为各个零件然后交给抽象建造者去规范各个零件的创建流程
- 具体建造者(ConcreteBuilder):根据抽象建造者规范的流程去具体创建零件,穿件多类产品是,具体创建者可以有多个。
优缺点
优点
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
代码实现
产品类
package com.hupp.builder;
public class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show(){
System.out.println(partA);
System.out.println(partB);
System.out.println(partC);
System.out.println("产品创建完成");
}
}
抽象创建者
package com.hupp.builder;
public abstract class Builder {
//创建产品对象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult(){
return product;
}
}
实际创建者
package com.hupp.builder;
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA() {
product.setPartA("创建了A零件");
}
@Override
public void buildPartB() {
product.setPartB("创建了B零件");
}
@Override
public void buildPartC() {
product.setPartC("创建了C零件");
}
}
指挥者
package com.hupp.builder;
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
public Product construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客户
package com.hupp.builder;
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
product.show();
}
}
执行结果