JiveJdon Community Forums
在线146人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
google yahoo 365Key网摘 CSDN网摘 添加到百度搜藏 POCO网摘 新浪ViVi 天极网摘
???en_US.forumThreadNext.name??? 下一主题
Go 共有 3 回复 / 1
 发表新帖子   回复该主题贴
liubing76

悄悄话
发表文章: 16
注册时间: 2003年03月27日 12:42
Builder模式的理解!! 2003年05月14日 13:43 到本帖网址 加入本帖到收藏夹 回复该主题
标签     


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();
banq

悄悄话
发表文章: 9613
注册时间: 2002年08月03日 17:08
Re: Builder模式的理解!! 2003年05月15日 18:52 到本帖网址 加入本帖到收藏夹 回复该主题
好,不错。
ITfuture

悄悄话
发表文章: 50
注册时间: 2007年07月28日 13:03
re:Builder模式的理解!! 2008年08月26日 10:37 到本帖网址 加入本帖到收藏夹 回复该主题
真是分析的很好.我对builder模式的理解更加深了一步.最重要的还是实践.努力ing
huajunting

悄悄话
发表文章: 4
注册时间: 2008年08月28日 12:15
re:Builder模式的理解!! 2008年08月28日 13:17 到本帖网址 加入本帖到收藏夹 回复该主题
蛮好,我再加点自己的理解.builder模式是要将产品的创建从产品自身分离出来,用外界的成套设备进行专业化生产。产品的特质不是它本身来控制,而是外界定制。不晓得可不可以这样理解。
标签     
共有 3 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG:
正在读取,请等待...
查询本论坛内 回复超过的热门帖子
标题
 
粗体: [b]文本[/b] 斜体: [i]文本[/i] 下划线 [u]文本[/u] 插入图片 [img]http://wwww.xxxx.com/img.ext[/img] 插入代码 [code]程序代码[/code]  插入url链接 [url]http://url[/url] / [url=http://url]URL加下滑线[/url] 插入附件 插入word文档 Txt等文件
内容
  提交时自动拷贝以上内容到剪贴板 Ctrl-V可取出;提问题前先查询标签列表

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区 推荐Chrome快速浏览本站
OpenSource JIVEJDON v3.5 Powered by JdonFramework Code © 2002-09 jdon.com

anti spam