如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/52089568
1 什么是建造模式
建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
2 如何实现建造模式
先从一个小问题入手。
* 假设电脑由主板、CPU、内存、硬盘和显卡组成
* 为了组装一台电脑,我们需要先装主板,然后装CPU、内存、硬盘、显卡
* 请你设计几个类来描述这一创造过程
很明显我们需要设计好多类来组成一台电脑,且这些类有明显的先后建造次序,因此用建造模式就比较合适。
建造模式的思想是客户无需知道产品内部是如何建造的,只需要通过一个导演类的方法就可以轻松的建造出来。所以这次我们先写测试类。
package com.ittianyu.builder;
public class Test {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
Computer computer = director.construct();
System.out.println(computer);
}
}
测试代码非常简单,new一个ComputerDirector对象,通过这个对象创建了一个Computer对象,我们完全不用知道电脑里面是怎么组装的。
接下来我们需要来写ComputerDirector类,这个类有个方法construct返回Computer对象。
package com.ittianyu.builder;
public class ComputerDirector {
protected Builder builder = new ComputerBuilder();
public Computer construct() {
builder.builderPart1();
builder.builderPart2();
builder.builderPart3();
builder.builderPart4();
builder.builderPart5();
return (Computer)builder.retrieveResult();
}
}
你可能会问Builder和ComputerBuilder是什么东西。别急,我们先把方法内的代码看完。
方法主要调用了5个builder对象的方法,这些方法名字还特别像,一看就知道是建造5个部分,最后调用builder.retrieveResult()来返回生成的对象。
你是不是以为这个导演类是最复杂的,所有构建逻辑都在里面。事实上这个导演类只是负责进一步封装Builder的子类。实际构建逻辑在具体的Builder的子类。
不墨迹了,我们来看一下Builder类和子类。
package com.ittianyu.builder;
public abstract class Builder {
public abstract void builderPart1();
public abstract void builderPart2();
public abstract void builderPart3();
public abstract void builderPart4();
public abstract void builderPart5();
public abstract Object retrieveResult();
}
Builder类很简单,只是定义了抽象方法。定义这个抽象类只是为了代码复用,如果后面又多出一个Phone的建造类,这时还可以继承这个类来统一接口。
接下来我们看看具体的ComputerBuilder类。
package com.ittianyu.builder;
public class ComputerBuilder extends Builder {
protected Computer computer = new Computer();
@Override
public void builderPart1() {
computer.setMainBoard("华硕主板001");
}
@Override
public void builderPart2() {
computer.setCPU("I7 6820HK");
}
@Override
public void builderPart3() {
computer.setRAM("金士顿 DDR4");
}
@Override
public void builderPart4() {
computer.setHD("JR 100X6P 3PTM");
}
@Override
public void builderPart5() {
computer.setGPU("NVIDIA GeForce GTX 960M");
}
@Override
public Object retrieveResult() {
return computer;
}
}
是不是吃了一惊,怎么内部只有个Computer类。
这主要是我太懒了不想建那么多类,比如什么CPU、主板、GUP这些类,所以全部用String代替了,建造的时候直接就设置了一下字符串。(0.0原谅我这一生不羁放荡爱自由)
到这里算是完成了。
慢着,好像忘了最重要的产品类,也就是Computer类。
天了噜,等我把这类补上。
package com.ittianyu.builder;
public class Computer {
private String mainBoard;
private String CPU;
private String RAM;
private String HD;
private String GPU;
public Computer(){}
public Computer(String mainBoard, String cPU, String rAM, String hD,
String gPU) {
super();
this.mainBoard = mainBoard;
CPU = cPU;
RAM = rAM;
HD = hD;
GPU = gPU;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getCPU() {
return CPU;
}
public void setCPU(String cPU) {
CPU = cPU;
}
public String getRAM() {
return RAM;
}
public void setRAM(String rAM) {
RAM = rAM;
}
public String getHD() {
return HD;
}
public void setHD(String hD) {
HD = hD;
}
public String getGPU() {
return GPU;
}
public void setGPU(String gPU) {
GPU = gPU;
}
@Override
public String toString() {
return "Computer [mainBoard=" + mainBoard + ", CPU=" + CPU + ", RAM="
+ RAM + ", HD=" + HD + ", GPU=" + GPU + "]";
}
}
这个类看着长了点,其实也就是5个成员变量,然后是这些变量的get、set、toString方法。
3 什么时候需要建造模式
看过上面的实现后相信你对建造模式有了一定的了解。
最后我们来总结一下使用建造模式的情况。
* 需要生成的产品对象有复杂的内部结构。
* 需要生成的产品对象的属性相互依赖。也就是内部属性构造有顺序要求。
* 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。