构造者模式(又叫生成器模式 Builder Pattern)
将一个复杂对象(下面说的车,手机等)的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
首先看UML图
可以看到他主要的3个部分,还是借鉴大家普遍采用的汽车制造来说明
首先是一个抽象类Builder,Builder中声明了一个具体产品各部件所需要的抽象方法以及一个返回最终产品的抽象方法。比如建造轮胎,建造引擎,建造外壳……以及一个返回最终产品车的方法
public abstract class Builder {
public abstract void buildEngine();
public abstract void bulidTyre();
public abstract void buildCar();
public abstract void getCar();
}
其次,是下面的具体实现类ConcreeteBuilder,这也是构造者模式的最主要部分,他负责详细的去定义每个部件的具体制作,也就是不同的ConcreeteBuilder实现不同的建造轮胎,引擎,外壳的方法,比如我们具体类分别为BMW,Ford。。。
public class BMW extends Builder{
public void buildCar() {
...//造外壳细节
}
public void buildEngine() {
...//造引擎
}
public void bulidTyre() {
...//造轮胎
}
public Car getCar() {
return new Car();
}
}
最后,是一个Director类,他类似于一个发令员,在汽车制造中,就是负责组装,将各个部件组合成最终产品,交还给客户,调用一个Builder类对象,并指导完成各步建造
public class Director {
public void product(Builder builder){
builder.buildCar();
builder.buildEngine();
builder.bulidTyre();
}
}
到此为止,生成器模式就完成了,来看看如何去制造一个具体的产品返回给客户
public class Client {
public static void main(String args[]){
Builder builder=new BMW();//创建一个Builder对象
Director director=new Director();//创建一个Director对象
director.product(builder);//Director对象造车
builder.getCar();//将制造的车返回
}
}
最终我们的构造者/生成器模式,带给我们了这样的结果
●生成器模式可以改变它所构建的产品的内部表示,另外还隐藏了产品如何装配的细节(Director)
●每个特定的生成器与其他生成器以及程序的其余部分无关。这增强了程序的模块性,并使增加额外模块变得相对简单(很明显,只要再实现一个新的ConcreeteBuilder即可)
●由于每个生成器都是根据数据逐步构建最终产品的,因此可以对生成器所构建的每个最终产品拥有更多的控制(在ConcreeteBuilder中)
总结下生成器模式与抽象工厂的区别,他们都返回由多个方法和对象组成的类
抽象工厂模式返回一系列相关的类
生成器模式根据所提供的数据将逐步构建一个复杂的对象
如果对比抽象工厂中举的手机例子,我的理解是,生成模式将为每个手机的建造提供一致的方法,比如建造外壳(Nokia),建造电池,建造芯片,安装系统。。。。。可以明显看出2个设计模式的区别