`
d02540315
  • 浏览: 31388 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Build模式的理解

阅读更多
Builder模式
是为了将构建复杂对象的组装过程和它的创建部件与产品对象分离.注意: 是解耦组装过程和创建具体部件.
过程实现使用Director,它仅关心组装部件的过程,不关心每个具体部件的创建。
而Builder则是定义出创建部件的接口,然而具体的创建,则是有ConcreteBuilder
来实现。

由于在Director使用是Builder接口所以,这样就可以重用创建过程,因为
不同的ConcreteBuilder,虽然创建部件不同相同,但是组装过程却相同。


我们假设,每个汽车都有车轮,发动机等部件组成,如果不使用模式,按照一般的方法,
在构造函数中,创建部件车轮,发动机,并且然后进行了组装。
下面以一辆Polo为例:
public class Polo{
//在构造函数中,创建部件,然后进行组装
public Polo(){
//创建部件
车轮 obj1=new 车轮();
//进行组装部件
this.车轮s.add(obj1);

车轮 obj2=new 车轮();
this.车轮s.add(obj2);
//这里省略其他两个车轮
.................

汽车发动机 objNessan=new 汽车发动机();
this.汽车发动机=objNessan;

}
//汽车的组成部件
public vector 车轮s=new Vector;

public 汽车发动机 汽车发动机 =null;
//这里省略了其他部件和功能函数
.................
}


这就是我们没有使用Builder的方式,这样使构造函数相当的复杂。
因为它负责创建具体的部件如(4个车轮,和一个发动机),然后需要进行组装成为产品Polo.
如果我们再增加一种车的类型HongDa,虽然它们种类不同,具体的部件不同,
但是组装的过程相同和部件的抽象(4个车轮和一个发动机)相同。
这样违背地OO的思想重用,于是我们把组装的过程,和创建部件,从产品的构造中独立出来,
其实就是简化产品的构造函数,封装成对象,来重用。
于是我们外部化一个Builder它负责创建汽车部件和组装过程,因为创建的部件不同,如Polo的车轮和HongDa的不同,但是它们的组装过程却是相同的,于是我们先定义,几个方法将由它的具体子类实现,
和一个具体的方法,它负责组装过程。明白的会看出这就是模板方法(Template Method)模式。

//它抽象了创建部件,定义一个骨架方法
public class Builder{
public void builder车轮(int n){};
public void builder发动机(){};

public void director构造过程(){
this.builder车轮(4);
this.builder车轮();
}
}

public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder车轮(int n){
for(int i=0;i<n;i++){
车轮 obj1=new 车轮();
polo.车轮s.add(obj1);
}
}
public void builder发动机(){
汽车发动机 objNessan=new 汽车发动机();
polo.汽车发动机=objNessan;
}
public Polo getProduct(){
return polo;
}
}


其实当builder模式的director角色和builder角色合并得化,它就是template method
模式。
抽象方法负责创建部件,具体骨架方法负责组装过程。这样具体的builder只需实现抽象
方法。

Builder目前负责创建部件和组装过程,如果我们把这两个职责,
再进行划分处理,单独一个负责组装过程,另一个负责创建部件。
因为虽然部件不同,但是过程是相同的。于是抽象出两个类。

//该类负责创建部件,具体的由子类实现
public class Builder{
public void builder车轮(int n){};
public void builder发动机(){};
}
//该类实现组装过程
public class Director{
private Builder builder=null;

public class Director(Builder builder){
this.builder=builder;
}

public void 组装过程(){
builder.builder车轮(4);
builder.builder车轮();
}
}

在Director中使用builder接口,然后按照一定规则进行组装,大家可以
看出这是针对接口进行编程的体现。我们看具体的builder
public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder车轮(int n){
for(int i=0;i<n;i++){
车轮 obj1=new 车轮();
polo.车轮s.add(obj1);
}
}
public void builder发动机(){
汽车发动机 objNessan=new 汽车发动机();
polo.汽车发动机=objNessan;
}
public Polo getProduct(){
return polo;
}
}


客户端的使用,首先创建具体的builder,然后使用Director
PoloBuilder polobuild=new PoloBuilder();
Director d=new Director(polobuild);
d.组装过程();
Product p=polobuild.getProduct();
分享到:
评论
1 楼 bbym010 2010-07-19  
通俗易懂,不错

相关推荐

    Android代码-MVP模式开发框架

    可以看看这篇文章对这种模式的理解:《MVP模式的一种新的尝试》 以及框架的具体介绍文章:《MVP开发框架的第一次尝试》 重复依赖 butterknife 添加依赖: gradle: Add it in your root build.gradle at the end of ...

    千博企业网站管理系统标准版 v2013 Build0206.rar

    深刻理解是:通过SEO这样一套基于搜索引擎的营销思路,为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而获得品牌收益。 5、栏目无限扩展,可任意扩展网站栏目架构,减少网站维护成本支出。...

    react-build:React build,是一个简单的项目,试图定义一个模型和开发概念

    React build 是一个寻求构建构建组件概念的项目,担心可扩展性、可维护性以及最重要的是开发的易用性。 您在此项目中找到的每个文件夹或元素都将有一个README文件,该文件将在“什么” 、 “为什么”和“用于什么”...

    asoft签到管理系统tykq3.5_build20110125

    【官方支持】 ...实在不能解决,请Q我:2643148,请附加信息:asoft签到管理系统。 【如何安装】 ...4、 修改单机模式和局域网模式的跳转,现在当你单机测试的时候程序不再向网关发送请求来获取返回的IP地址...

    千博学校网站管理系统 v2019 Build0116.zip

    千博学校网站管理系统 v2019 Build0116 更新日志 开放全部功能,无任何功能限制、无时间限制。 千博学校网站管理系统简介 千博学校网站管理系统是根据教育行业客户实际应用需求而提供的一套完整的学校网站应用...

    百威9000服装鞋帽版 build20050304

    工作流程简明清晰,易于理解,操作简便。同时提供多种操作途径,业务操作既可在系统菜单中完成,也可流程图中完成。 3. 丰富的报表功能,多样的图形显示方式 系统提供丰富的图形报表功能,简明、直观地体现销售业务...

    千博学校网站管理系统 v2015 Build0108.rar

    深刻理解是:通过Seo这样一套基于搜索引擎的营销思路,为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而获得品牌收益。 5、栏目无限扩展,可任意扩展网站栏目架构,减少网站维护成本支出。...

    C#设计模式

    我们可以将 Builder 理解成电饭锅,给这个 Builder 放进去米和水,经过 Builder 的 Build后 , 我们就可以取出香喷喷的米饭了。 C#中有一个类叫 StringBuilder,输入必要的信息后,就可以取出对应的 String

    opentracing-cpp:适用于C ++的OpenTracing API

    在调试模式下构建目标MSBuild.exe opentracing-cpp.sln /p:Configuration=Debug /Target=Build 在发布模式下构建目标MSBuild.exe opentracing-cpp.sln /p:Configuration=Release /Target=Build

    千博律师/学校/医院网站管理系统 v2012 Build1021.rar

    深刻理解是:通过Seo这样一套基于搜索引擎的营销思路,为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而获得品牌收益。 5、栏目无限扩展,可任意扩展网站栏目架构,减少网站维护成本支出。...

    adfbuild2018:Microsoft Build 2018会议会话的Azure数据工厂演示代码

    adfbuild2018 本文档将解释如何理解,使用和部署此回购中的演示资产。 旨在为Azure数据工厂(ADF)提供一个演示环境,以通过一系列数据转换活动将数据从Azure Blob和Amazon AWS中的平面文件以及REST API加载到Azure...

    Meme-Generator-App-with-ReactJS:这是一个利用 React Js 开发的模因生成器应用程序,这是一个很好的理解 React 基础和逻辑的项目

    Meme-Generator-App-with-ReactJS 这是一个利用 React Js 开发的模因生成器应用程序,这是一个很好的理解 React 基础和逻辑的项目创建 React 应用程序入门这个项目是用引导的。可用脚本在项目目录中,您可以运行:...

    cars_react:娇小的应用程序可以理解

    npm run build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且文件名包括哈希值。 您的应用已准备好进行部署! 有关更多信息,请参见关于的部分...

    React-Electron:React电子入门和理解基本概念

    npm run build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且文件名包括哈希值。 您的应用已准备好进行部署! 有关更多信息,请参见关于的部分...

    quicker-picker:简单的拾色器,利用人类对颜色的理解

    在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。 yarn test 在交互式监视模式下启动测试运行器。 有关更多信息,请参见关于的部分。...

    covid19tracker:尝试利用covid19 api并将其用于理解react-chartjs-2中的图表

    yarn build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 最小化构建,文件名包含哈希。 您的应用已准备好进行部署! 有关更多信息,请参见有关的部分。yarn ...

    asp.net知识库

    Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取数据库中某个某个表的创建脚本 DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用...

Global site tag (gtag.js) - Google Analytics