重点:人都会经历,婴儿、少年、青年、中年、老年。但是每个人又不完全一样。 建造者,在盖楼房,每一个房子肯定都不一样,但是盖楼的流程都是相同的。
作用:保证流程不变。
一般遇到需要 把控流程,细节多样的模式,就可以使用建造者。用一个director类来把控。许多builder去建造 流程 中的 细节产品。
将一个复杂对象的构建 与它的表示分离。使得同样的构建流程,但是有不同的表示。
客户不知道产品内部实现。
builder之间是相互独立的。 比如在游戏中,如果想换个英雄,那么重新new一个concreteBuilder 创建就OK了。很容易扩展。
因为构建出来的都一样,所以对其他模块不影响。
builder:接口,规范建造者,要构建产品的组成,不能随便构建,不设计具体构建。
concreteBuilder:根据接口,具体构建
director:导演,把控流程,保证 复杂对象 各部分,创建的顺序。
product: 最终生成的复杂对象。
//我们要生产出一个人
class Product {
private Head head;
private Hand hand;
private Foot foot;
}
//抽象建造者,必须提供相应的 生成方法,来规范具体生产者。 (接口也是可以的。)
abstract class Builder{
public abstract void builderHead();
public abstract void builderHand();
public abstract void builderFoot();
}
//具体建造者,继承重写里面的方法。提供每个组件的 构建方法。并且设置到 复杂对象中。 并 提供一个 返回复杂对象的方法。
class concreteBuilder extends Builder{
private Product product;
public void builderHead() {
product.setHead(new Head());
}
public void builderHand() {
product.setHead(new Hand());
}
public void builderFoot() {
product.setHead(new Foot());
}
public Product getProduct(){
return this.product;
}
}
//导演。控制 制造的流程。什么时候返回 对象、
class Director{
private Builder builder;
public void Director(Builder builder){
this.builder = builder;
}
public void create1(){
builder.createHead();
}
public void create2(){
builder.createHead();
builder.createHand();
builder.createFoot();
}
}
//我们在 使用时。如何拿到 导演 ‘导’ 好的对象
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director .create1(); //这一步来固定构建顺序。 具体构建 由build觉得。。构建一个 小手 大手 都是 concretebuilder决定的。
Product product = builder.getProductor();