抽象一点说建造者模式的目的:
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。——-《设计模式》GOF
举个例子,一台电脑的主板上有很多的硬件,可能根据需要要经常的更换。比如现在要将Intel的CPU换成AMD的,那么我们不需要从新的构建一块主板,而是只换CPU就可以了。这就是建造者模式需要达到的目的。整个建筑过程和具体的表示分离,建造过程指的是每个电脑主板都有cpu,表示指的是具体使用的CPU型号。很好理解,表示和建造过程实际上没有必然的联系,如果分离将增加很多的灵活性。
一般建造者模式包含以下几个类,Builder,product,Director,ConcreteBuilder。我们想象一个这样的场景。要建造一块主板,这个建造过程是可以确定的,不能确定的是各个零部件的生产厂家。Product就是主板,主板中包含了cpu,memory,io零部件。建造者只管建立这些零部件,Director负责将零部件组合到一起形成产品,并通过一个方法提供产品。
我们来看一下UML:
builder作为一个基本的建造者接口
public interface Builder {
public void buildCPU();
public void buildMemory();
public void buildIO();
public Productor getProductor();
}
SonyBuilder实现建造者接口
public class SonyBuilder implements Builder{
private Productor productor= new SonyProductor();
public void buildCPU() {
productor.setCPU("sonyCPU");
}
public void buildMemory() {
productor.setMemory("sonyMemory");
}
public void buildIO() {
productor.setIo("sonyIO");
}
public Productor getProductor(){
return productor;
}
}
SonyProductor继承productor
public class SonyProductor extends Productor{
public String getIo() {
return io;
}
public void setIo(String io) {
this.io = io;
}
public String getCPU(){
return this.cpu;
}
public void setCPU(String name){
this.cpu=name;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
}
HuaweiBuilder实现建造者接口
public class HuaweiBuilder implements Builder {
private Productor productor = new HuaweiProductor();
@Override
public void buildCPU() {
productor.setCPU("huwei cpu");
}
@Override
public void buildMemory() {
productor.setMemory("huwei memory");
}
@Override
public void buildIO() {
productor.setIo("huwei io");
}
@Override
public Productor getProductor() {
return productor;
}
}
HuaweiProductor 继承productor类
public class HuaweiProductor extends Productor {
public String getIo() {
return io;
}
public void setIo(String io) {
this.io = io;
}
public String getCPU(){
return this.cpu;
}
public void setCPU(String name){
this.cpu=name;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
}
Director中构建一个Productor(可以是索尼,也可以是华为)
public class Director {
public Productor Construction(Builder builder){
//建造顺序是由director决定的
builder.buildCPU();
builder.buildIO();
builder.buildMemory();
return builder.getProductor();
}
public static void main(String[] args){
Director dirctor = new Director();
Productor productor=dirctor.Construction(new SonyBuilder());
//显示建造的结果
System.out.println(productor.getCPU());
System.out.println(productor.getMemory());
System.out.println(productor.getIo());
productor = dirctor.Construction(new HuaweiBuilder());
//显示建造的结果
System.out.println(productor.getCPU());
System.out.println(productor.getMemory());
System.out.println(productor.getIo());
}
}
运行结果:
sonyCPU
sonyMemory
sonyIO
huwei cpu
huwei memory
huwei io