建造者模式,将复杂对象的创建过程与它的表示分离,即容许用户在不知道对象内部细节的情况下,一步步创建对象的过程。并使得同样的构建过程可以创建不同的表示。
一、关键点
1)我们先来看下这个模式的关键点:
构建与表现分离:这是找个模式的比较明显的特征,即将构建负责对象的过程与它的部件解耦了;
构建过程:由于第一个特征,表现和构建分离,这样就使得同样的构建过程可以创建不同的表示。也能根据需要控制构建顺序或构建方法,而产生需要的结果;
2)我们再来看下它的类图关系:
Product:产品抽象类;
Builder:抽象Builder,定义构建的相关方法;
ConcreateBuilder:具体Builder实现类;
Director:构建使用Builder接口的对象;
二、实现
2.1 产品对象
public class Product {
void doA() {
/** do something 'A' */
}
void doB() {
/** do something 'B' */
}
}
2.2 抽象Builder
public interface Builder {
void buildPartA();
void buildPartB();
}
2.3 构建Builder
public class ConcreteBuilder implements Builder {
private Product mProduct = new Product();
@Override
public void buildPartA() {
mProduct.doA();
}
@Override
public void buildPartB() {
mProduct.doB();
}
}
2.4 Director 统一组装对象
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
2.5 运用
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director();
director.construct(builder);
}
三、小结
3.1 封装性。建造者模式具有良好的封装性,可以使客户端不需要知道产品的内部组成细节;
3.2 拓展性。客户端可灵感拓展Director,按需控制budiler构建过程和执行顺序,从而灵感控制构建过程;
3.3 优化。实际使用的过程中,Director往往被省略,而直接使用Builder的链式调用来进行构建。
该链式调用的特点就是每个对应的构建方法都return this,这样链式的调用使得整体结构更简单灵活。
链式调用的实现代码大致如下:
public class ProductObj {
private final String mName;
private final String mValue;
private ProductObj(Builder builder) {
this.mName = builder.name;
this.mValue = builder.value;
}
public static class Builder {
private String name;
private String value;
public Builder buildName(String nameObj) {
this.name = nameObj;
return this;
}
public Builder buildValue(String valueObj) {
this.value = valueObj;
return this;
}
public ProductObj build() {
return new ProductObj(this);
}
}
}