一、概念
将一个复杂对像的构建与它的表示分离,使得同样的构建过程创建不同的表示,又叫建造模式。
生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。采用不同的构建实现,产生不同的产品。所以生成器模式都会存在以下两个部分:
a.整体构建算法
b.部件的构造和产品的装配
二、模式动机
生成器模式主要的功能就是构建复杂的产品,且是细化的、分步骤的构建产品,生成器模式重在一步一步解决构造复杂对像的问题。
三、模式的结构
示意代码:
/**
*
* @ClassName: Product
* @Description: TODO(被构建的产品对像接品)
* @author beteman6988
* @date 2017年10月1日 上午11:26:33
*
*/
public interface Product {
}
/**
* 成生器接口,定义构建一个产品对像所需要的各个部件的操作
* @ClassName: Builder
* @author beteman6988
* @date 2017年10月1日 上午11:28:12
*
*/
public interface Builder {
/**
* 构建某个部件
* @Title: buildPart
* @param
* @return void
* @throws
*/
public void buildPart();
/**
* 获取最终生成的产品对像
* @Title: getResult
* @param @return
* @return Product
* @throws
*/
public Product getResult();
}
public class ConcreteBuilder implements Builder {
//最终构建的产品
private Product resultProduct;
/**
* 获取最终生成的产品
* @Title: getResult
* @param @return
* @return Product
* @throws
*/
@Override
public Product getResult() {
return this.resultProduct;
}
@Override
public void buildPart() {
// TODO Auto-generated method stub
}
}
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/**
* 指导生成器构建最终的产品对像
* @Title: construct
* @param
* @return void
* @throws
*/
public void construct() {
builder.buildPart();
builder.getResult();
}
}
a.Builder:生成器接口,定义创建一个Product对像所需要的各个部件的操作。
b.ConcreteBuilder:具体生成器的实现,实现各个部件的创建,并负责组装Product对像的各个部件,同时还提供一个让用户获取组装完毕后的产品对像的方法。
c.Director:指导者,抽像出来的整体构建算法,主要用来使用Builder,以一个统一的过程来构建所需要的Product对像。
d.Product:产品,表示被生成器构建的复杂对像,包含多个部件。
四、模式样例
以一次台式机组装经历为例,当我们去电脑城组装电脑时,首先导购小妹妹会拿出一张打印好的空白配置报价单,我们在导购小妹的引导下,填写(当然小导购小妹填写)完了报价单后,然后组装工程师小哥就会跟据这个报价单,去仓库领取所有配件,然后就会将所有的配件组装在一起,一个完整的computer就组装好了,最后我们交钱拿电脑走人。
运用生成器模式对上述过程进行分析:
a.Product:导购小妹给我们的那个报价单可以说是一台最终computer product的一个抽像,当我们填写完一个一个完整的报价单后,可以说一个具体的compueter已经有了,
不过目前还是一堆零部件,要想得到一台完整的computer,还需要一个组装的过程。
b.Builder:我们的组装工程师小哥,跟据不同的具体报价单,都要去仓库忙一翻,要找到所有的部件,可以说只要有报价单,小哥都要将具体产口的每个部件都要找出来,少一个可以说都不行,这个可以说是一个完整电脑每个部件的抽像的建造(只是去仓库的相关位置拿到相关部件)。
c.ConcreteBuilder:组装工程师小哥跟据具体的报价单,去仓库找到相应的配件,并对每个部件进行处理,该拆封的拆封,该插线的插线,然后依据一定的步骤组装将所有配件组装起来,组装成一台完整的电脑。
d.Director:电脑的组装可以说有固定的套路,可以说这个套路适应于所有的电脑组装,比如必须先有机箱,然后将主板装到机箱上,然后将cpu装到主板上,步骤不能乱。按这个套路,工程师小哥跟据不同的报价单组装出不同的computer.
代码如下:
public interface CBuilder {
/**
* 构建机箱
* @Title: buildBox
* @param
* @return void
* @throws
*/
public void buildBox();
/**
* 安装主板
* @Title: buildMBoard
* @param
* @return void
* @throws
*/
public void buildMBoard();
/**
* 安装CPU
* @Title: buildCpu
* @param
* @return void
* @throws
*/
public void buildCpu();
/**
* 安装内存
* @Title: buildMemory
* @param
* @return void
* @throws
*/
public void buildMemory();
/**
* 安装硬盘
* @Title: buildHDisk
* @param
* @return void
* @throws
*/
public void buildHDisk();
/**
* 返回安装完毕的计算机
* @Title: getComputer
* @param @return
* @return ComputerA
* @throws
*/
public ComputerA getComputer();
}
public class ComputerABuilder implements CBuilder {
private ComputerA aComputer=new ComputerA();
@Override
public void buildBox() {
this.aComputer.setBox("MAtx");
}
@Override
public void buildMBoard() {
this.aComputer.s