设计模式05:建造者模式

来源:互联网 发布:舒柏奇犬 知乎 编辑:程序博客网 时间:2024/06/05 05:00

抽象一点说建造者模式的目的:
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。——-《设计模式》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();@Overridepublic void buildCPU() {    productor.setCPU("huwei cpu");}@Overridepublic void buildMemory() {    productor.setMemory("huwei memory");}@Overridepublic void buildIO() {    productor.setIo("huwei io");}@Overridepublic 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

0 0
原创粉丝点击