设计模式之建造模式
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 什么时候需要建造模式
看过上面的实现后相信你对建造模式有了一定的了解。
最后我们来总结一下使用建造模式的情况。
* 需要生成的产品对象有复杂的内部结构。
* 需要生成的产品对象的属性相互依赖。也就是内部属性构造有顺序要求。
* 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
相关文章推荐
- 设计模式之四 --- 建造(Builder)模式
- 设计模式--创建模式--建造模式--java
- 设计模式之构建(Builder)模式 建造房子实例分析
- 设计模式(7)-建造模式(Build)
- JAVA设计模式——建造(Builder)模式
- 设计模式之七:建造模式(Builder Pattern)
- 设计模式之四 --- 建造(Builder)模式
- 设计模式之四 --- 建造(Builder)模式
- 常见设计模式之【建造模式】
- JAVA设计模式之建造模式 (创建型模式)
- 抽象工厂与建造设计模式结合
- 设计模式之十三 建造者模式(建造小人)
- 设计模式-建造模式-一碗牛肉面的制作过程
- 六、设计模式 之 建造模式
- 设计模式-建造模式(一碗牛肉面的制造过程)
- Java的建造设计模式
- 5.23种设计模式的Java版--Builder (建造)
- 设计模式——建造模式
- 深入浅出设计模式笔记之三:建造模式
- 设计模式-建造模式(一碗牛肉面的制造过程)