Never give up!

如果说软件开发是一条布满荆棘的坎坷之路,那么我会每天在这道路两旁书上“火焰舞者,到此一游!”。

 

Builder模式的理解

      Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不需要知道内部的具体构建细节。因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮、方向盘、发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车呢?这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开。是为了将构建复杂对象的过程和它的部件解耦。注意::是解耦过程部件
        就拿造房子来说,比如某一天你的领导找到了你,“小A啊,工作不错,你的能力和态度都是我比较欣赏的,好好干前途一片大好”,然后你摸摸脑袋,呵呵傻笑,“我最近想盖一栋别墅,你帮我搞定吧,有你在,我放心”,然后你屁颠屁颠跑去找了N个各个领域的师傅,砌墙的、安装电线的、装地板的、修马桶的乱78遭一堆人,好了,现在可以动工了吧。但你手下的那些师傅却是你瞧我,我瞧你的,“老板,怎么应该做成什么样的别墅,先从哪搞起?”这时侯,你也傻了吧,忽略了最重要的一环-设计,没办法锅自己也不会,去找个设计师设计兼指挥吧。设计师列出了N个方案,并选择了其中之一就动工了。一个月后,你的上司找你要了房子交付后,这个过程也就完结了。builder模式就是这么个过程,把你的装配过程(设计师指挥各个师傅装配房子的顺序过程)和这个builder(带领各个专职师傅所作的事情)也就是部件职责分离。光说不练,没用,那接下来咱就贴下代码更加形象化下,如下:
         UML类图:

        UML顺序图粗略如下:
          

           首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示。
public interface Builder {

    
// 比如砌墙
    public void buildPartA();
    
    
// 比如装电线
    public void buildPartB();
    
    
// 比如装马桶
    public void buildPartC();
    
    
//返回最后组装成品结果 (返回最后装配好的汽车)
    
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行。
    
//从而实现了解耦【过程】和【部件】
    public Product getResult();
}

       用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:


public class Director {

    
private Builder builder;
    
    
/**
     * 产品的组装过程,这里可以改变装配顺序,从而得到不同的方案
     
*/

    
public void build() {
        builder.buildPartA();
// 先砌墙
        builder.buildPartB();// 再装电线
        builder.buildPartC();// 而后装马桶
    }

}


      Builder的具体实现ConcreteBuilder,通过具体完成接口Builder来构建或装配产品的部件,定义并明确它所要创建的是什么具体东西;提供一个可以重新获取产品的接口。
public class ConcreteBuilder implements Builder {

    
public void buildPartA() {
        
// 具体如何砌墙的过程
    }


    
public void buildPartB() {
        
// 具体如何装电线的过程
    }


    
public void buildPartC() {
        
// 具体如何装马桶的过程
    }


    
public Product getResult() {
        
// 返回最后的组装的产品(房子)
        return new Product();
    }


}

       复杂对象:产品Product
public interface Product { } 

       复杂对象的部件:部件Part
public interface Part { }

       接下去就是我们的老板来找我们要房子了:
ConcreteBuilder builder = new ConcreteBuilder();
Director director 
= new Director( builder ); 

director.build(); 
Product product 
= builder.getResult(); 

       整个builder模式就这样完结了,当然有人会有疑问“为什么getResult不放在Director里?”至于这个问题我是这么想的,你的老板当然是找你要房子了,难不成还找设计师要?我们是builder嘛,那些部件(Part)可都是我们管理的,而设计师只负责设计组装,这样过程和部件不是职责分离的很清楚吗?如果哪一天,老板又想造另外一栋格式不一样的别墅,我们就直接找设计师解决下。至于builder模式和abstract factory模式的差异,我是这么理解的,builder模式注重于一个过程,而abstract factory则侧重于产品的管理。

posted on 2010-03-15 02:00 永远的火焰舞者 阅读(297) 评论(0)  编辑  收藏 所属分类: designing pattern


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔分类(10)

随笔档案(9)

文章档案(1)

搜索

最新评论

  • 1. re: JForum安装
  • 我就是想研究下sso,哈哈!再在JForum的基础上二次开发玩玩 呵呵
  • --Jlg
  • 2. re: JForum安装
  • JForum的代码还比较清晰,但谈不上强大,虽然一般也足够用了。
  • --一农

阅读排行榜

评论排行榜