您的位置:首页 > 其它

设计模式之建造模式

2016-08-01 22:01 363 查看



如有转载,请申明:

转载至 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 什么时候需要建造模式

 

看过上面的实现后相信你对建造模式有了一定的了解。

最后我们来总结一下使用建造模式的情况。

 

 * 需要生成的产品对象有复杂的内部结构。

 * 需要生成的产品对象的属性相互依赖。也就是内部属性构造有顺序要求。

 * 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息