建造者模式笔记
考虑如下场景:在游戏设计中通常会有很多的人物角色,诸如法师、牧师等各种角色,不同的角色各个部位可能都不一样,那么对于这一类的复杂对象,我们该如何创建呢?
这里介绍一种称之为建造者模式的方法,客户端只要知道需要建造的对象的类型和内容就可以创建它们,而无需知道创建对象的内部细节。
定义:建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
在建造者模式中包含如下几个角色
Builder 抽象建造者。为创建一个Product对象指定抽象接口,一般包含buildPartX()和getResult()两种方法。
ConcreteBuilder 具体建造者。实现抽象建造者接口,实现各个部件的具体构造方法。
Product 产品角色
Director 指挥者,负责和抽象建造者打交道,一般有construct方法,客户端与指挥者打交道,因为客户端知道具体建造者的类型,于是将类型参数传递给指挥者,那么指挥者的construct返回创建好的制定对象。
上面几个角色的实现代码如下:
class Builder {
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public Product getResult() {
return product;
}
}
class Product {
private String PartA;
private String PartB;
private String PartC;
/*这里省略A B C成员的setter和getter方法*/
}
//这里具体建造者可能有多个,针对不同的产品类型
class ConcreteBuilder {
public void buildPartA() {
/*TODO*/
}
public void buildPartB() {
/*TODO*/
}
public void buidlPartC() {
/*TODO*/
}
}
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
public Product construct {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
那么在客户端调用的时候:
ConcreteBilder cb = new ConcreteBuilder();
Director director = new Director(cb);
//director.setBuilder(cb);
Product product = director.construct();
总结:
建造者模式的核心在于如何一步步构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品。
可以很方便的替换或者增加具体建造者,可以更加精细地控制产品的创建过程。
一般需要生成的对象有复杂的内部结果,产品对象通常包含多个成员属性。而这些属性之间相互依赖,需要制定其生成顺序。
这边将产品的创建过程和创建顺序都放在Diretor类里面,而不是放在具体的建造者类里面和客户类里面。将产品的创建和使用隔离。