1 基础知识
1.1 标准定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
1.2 分析和说明
建造模式属于创建性模式,它就是讲产品的内部表象和产品的生成过程分割开来,从而使一个创建过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式是解决这类问题的一种思想方法--将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder角色包括抽象建造者角色(Builder)、具体建造者角色、导演者角色和产品角色。
抽象建造者角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,以接口独立于应用程序的商业逻辑。模式直接创建产品对象的是具体创造者创造者类必须实现这个接口所要求的两种方法:一种是建造方法;另一种是结果返还方法。一般来说,产品所包含的部件数目与建造方法的数目相符。换言之,有多少部件,就有多少相应的建造方法。
具体建造者角色:担任这个角色的是与应用程序紧密相关的一些类。它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:实现抽象建造者所声明的接口,给出一步一步地完成创建产品实例的操作。在建造过程完成后,提供产品的实例。
导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。
产品角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有公共的接口,而完全可以是不相关联的。
2 应用场景举例
比如公司要做一个软件项目,该软件项目由可行性研究、技术交流、投标、签订合同、需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等成。但是对于不同的项目,有不同的过程组成。如对于非投标项目ProjectA,只有需求调研、系统i设计、系统编码、系统测试、系统部署和实施、系统维护等过程。就可以采用Builder模式。
AbstractProjectProcessBuilder可以理解为抽象建造者(Builder)角色,ConcreteProjectProcessBuilder可以理解为具体建造者角色。ProjectA可以理解为导演者角色和产品角色的结合。其类图如下:
3 java的实现程序代码
Java程序实现主要包括AbstractProjectProcessBuilder抽象类文件,ConcreteProjectProcessBuilder类文件和ProjectA类文件等3个文件。
AbstractProjectProcessBuilder为抽象建造者角色
public abstract class AbstractProjectProcessBuilder{
List<String> processList = new ArrayList<String>();
//可行性分析过程
public void buildFeasibility(){};
//技术交流过程
public void buildTechnicalDiscussion(){};
//投标过程
public void buildBid(){};
//需求调研和分析过程
public void buildRequirement(){};
//设计过程
public void buildDesign(){};
//编码过程
public void buildProgram(){};
//测试过程
public void buildTesy(){};
// 部署和实施过程
public void buildDeplyment(){};
//维护过程
public void buildMaintenance(){};
public void showProcess(){
for(int j =0; j < processList.size();j++){
system.out.print(processList.get(j)+" ");
}
}
}
ConcreteProjectProcessBuilder为具体建造者角色
<pre name="code" class="html">public class ConcreteProjectProcessBuilder extends AbstractProjectProcessBuilder{
//可行性分析过程
public void buildFeasibility(){processList.add("可行性分析过程")};
//技术交流过程
public void buildTechnicalDiscussion(){processList.add("技术交流过程")};
//投标过程
public void buildBid(){processList.add("投标过程")};
//需求调研和分析过程
public void buildRequirement(){<span style="font-family: Arial, Helvetica, sans-serif;">processList.add("</span><span style="font-family: Arial, Helvetica, sans-serif;">需求调研和分析过程"</span><span style="font-family: Arial, Helvetica, sans-serif;">)</span>};
//设计过程
public void buildDesign(){processList.add("设计过程")};
//编码过程
public void buildProgram(){processList.add("编码过程")};
//测试过程
public void buildTesy(){processList.add("测试过程")};
// 部署和实施过程
public void buildDeplyment(){processList.add("投标过程")};
//维护过程
public void buildMaintenance(){processList.add("维护过程")};
}
<span style="white-space:pre"> </span>ProjectA为导演者角色和产品者角色的结合
<pre name="code" class="java">public class ProjectA{
private AbstractProjectProcessBuilder projectBuilder;
public ProjectA(AbstractProjectProcessBuilder builder){
projectBuilder = builder;
}
public void setBuilder(AbstractProjrctProcessBuilder builder){
projectBuilder = builder;
}
public void construct(){
projectBuilder.buildRequirement();
projectBuilder.buildDesign();
projrctBuilder.buildProgram();
projectBuilder.buildTest();
projrctBuilder.buildDeployment();
projectBuilder.buildMaintenance();
}
public void showProcess(){
projectBuilder.showProcess();
}
}
<span style="white-space:pre"> </span>测试程序代码为:
<pre name="code" class="java">public class client{
public static void main(String[] args){
ConcrereProjectProcessBuilder builder = new ConcreteProjectProcessBuilder();
ProjectA project1 = new ProjectA(builder);
project1.construct();
project1.showProcess();
}
}