建造者模式(Builder Pattern)
将复杂的对象的建造过程抽离出来,使这个抽象过程的不同实现方法可以构造出不同的表现(属性)的对象。
动机
建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
适用场景
-
当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。
-
当构造过程必须允许被构造的对象有不同表示时。
结构
代码示例
//构建使用Builder接口的对象
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product constructA() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getProduct();
}
public Product constructB() {
builder.buildPartB();
builder.buildPartA();
builder.buildPartC();
return builder.getProduct();
}
}
//建造一个Product对象的各个部件指定抽象接口
public abstract class Builder {
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public Product getProduct() {
return product;
}
}
//实现Builder的接口以构造和装配该产品的各个部件
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA() {
System.out.println("A");
}
@Override
public void buildPartB() {
System.out.println("B");
}
@Override
public void buildPartC() {
System.out.println("C");
}
}
//被构造对象
public class Product {
private String partA;
private String partB;
private String partC;
//省略getter,setter......方法
}
public class Client{
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
//不同的实现方法,可以构造不同的表现
Product product = director.construct();
System.out.println();
product = director.construct2();
}
}
:ABC
:BAC
总结
建造者模式将一个复杂对象的构建过程分离出来。不同的装配方式可以构造出来不同的表示,将构建部分和表示部分分开,这样可以更精细的控制构建过程。建造者隐藏产品的内部结构,同时也隐藏了产品是如何装配的,因为产品是通过抽象接口构造的,所以在改变产品的内部表示时只需要定义一个新的生成器来构建产品。
![大话编程那些事儿 wechat](https://www.chenzki.com/upload/2020/04/image-957b057fc0934d9d8aa75d6210b30be1.png)