1、定义:
建造者模式:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、结构:
建造者模式包括的角色:
(1)Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。
(2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。
(3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
(4)Product:要创建的复杂对象,产品类。
3、代码实现:
用组装电脑作为例子如下:
要组装一台电脑(Computer类),我们假设它有三个部件:CPU 、主板以及内存。
3.1产品类
package com.gcc.designmode.builder;
/**
*
* @author gcc
*
* 2018年2月26日
*/
public class Computer {
private String mCpu;
private String mMainboard;
private String mRam;
public String getmCpu() {
return mCpu;
}
public void setmCpu(String mCpu) {
this.mCpu = mCpu;
}
public String getmMainboard() {
return mMainboard;
}
public void setmMainboard(String mMainboard) {
this.mMainboard = mMainboard;
}
public String getmRam() {
return mRam;
}
public void setmRam(String mRam) {
this.mRam = mRam;
}
}
3.2 Builder类
package com.gcc.designmode.builder;
/**
* 抽象的builder类
* @author gcc
*
* 2018年2月26日
*/
public abstract class Builder {
public abstract void buildCpu(String cpu);
public abstract void buildMainboard(String mainboard);
public abstract void buildRam(String ram);
public abstract Computer create();
}
3.3 Builder实现类
下面是一个继承Builder的子类,里面不仅新建了Computer的实例,还提供了安装CPU、主板和内存的具体实现方法,并且在组装成电脑的create方法中将该Computer对象实例返回。
package com.gcc.designmode.builder;
/**
* Builder实现类
* @author gcc
*
* 2018年2月26日
*/
public class MyComputerBuilder extends Builder{
private Computer computer = new Computer();
@Override
public void buildCpu(String cpu) {
computer.setmCpu(cpu);
}
@Override
public void buildMainboard(String mainboard) {
computer.setmMainboard(mainboard);
}
@Override
public void buildRam(String ram) {
computer.setmRam(ram);
}
@Override
public Computer create() {
return computer;
}
}
3.4 Director类
指挥者(Director)类用来规范组装电脑的流程顺序,先安装主板,再安装CPU,最后安装内存并组装成电脑。
package com.gcc.designmode.builder;
/**
* 建造者 用于按一定顺序建造产品
* @author gcc
*
* 2018年2月26日
*/
public class Direcror {
Builder builder =null;
public Direcror(Builder builder) {
this.builder = builder;
}
public Computer CreateComputer(String cpu,String mainboard,String ram){
this.builder.buildCpu(cpu);
this.builder.buildMainboard(mainboard);
this.builder.buildRam(ram);
return this.builder.create();
}
}
3.5 测试类
package com.gcc.designmode.builder;
/**
* 测试 建造者模式
* @author gcc
*
* 2018年2月26日
*/
public class Test {
public static void main(String[] args) {
Builder builder = new MyComputerBuilder();
Direcror director = new Direcror(builder);
director.CreateComputer("i9", "Intel主板", "mRam");
}
}
4、建造者模式优缺点
建造者模式的优点:
(1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。
(2)建造者类逻辑独立,易拓展。
建造者模式的缺点:
很明显产生了多余的Build对象以及Dirextor对象,消耗了内存。
作者:scgyus