GOF设计模式学习笔记(三)---Builder模式

Posted on 2007-05-17 10:11 久城 阅读(4265) 评论(4)  编辑  收藏 所属分类: GOF设计模式

1.现实问题
面向对象编程总是和现实问题的解决思想一致的。


汽车是如何产生的?这个问题在学习工厂模式中已经举过例子。我再重新分析一下,看看有何不同。

Factory模式中:
1.有一个抽象的工厂。
2.实现一个具体的工厂---汽车工厂。
3.工厂生产汽车A,得到汽车产品A。
4.工厂生产汽车B,得到汽车产品B。

这样做,实现了购买者和生产线的隔离。

Builder模式:
1.离合器工厂生产离合器产品,得到汽车部件A。
2.轮胎工厂生产轮子产品,得到汽车部件B。
3.车身工厂生产车身产品,得到汽车部件C。
4.将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5.将这个整体送到汽车组装工厂,得到一个汽车产品。

或者更抽象一点理解:
1.将汽车的每一个零件都送到汽车组装工厂。
2.在工厂里,组装离合器,得到汽车部件A。
3.在工厂里,组装轮胎,得到汽车部件B。
4.在工厂里,组装车身,得到汽车部件C。
5.在工厂里,组装每个部件,得到一个汽车产品。

这样做,目的是为了实现复杂对象生产线和其部件的解耦。

二者不同在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品。而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

2.开阔天空
我在学习的时候,把代码例子认真的读了一遍,便豁然开朗。


学习模式的目的在于了解此模式究竟为何模式。了解了此模式的结构已足矣。给我的感觉,模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就够了。其精华的所在会在以后工作的设计中逐渐体现出来。

首先,当一个产品(对象)的创建过程很复杂的时候,且这个产品的实现需要分别实现几个不同的部件。这个时候,我们考虑用到Builder模式。具体实现过程的例子如下:

Product: 复杂对象类。我们最终就是为了得到它的一个对象。我叫它产品

// 这里有一个复杂对象类Product。它的构建需要PartA,PartB,PartC。
public class Product  {
    
public Product(Part partA, Part partB, Part partC){...};
}


Part: 复杂对象的部件接口。没准有几种。体现对象的复杂性。即产品部件

// 复杂对象部件接口Part。
public interface Part{
    
//
}

CarBuilder: 复杂对象的构建接口。Builder模式的重要体现之一---产品生成器
// 这里定义一个产品生成器接口。
public interface CarBuilder {
    
// 创建部件A
    void buildPartA();

    
// 创建部件B
    void buildPartB();

    
// 创建部件C
    void buildPartC();

    
// 返回产品,不用的组装过程会返回不同的产品。
    Product getResult();
}

MazidaBuilder: 具体的产品生成器对象
// 实现具体的产品生成器
public class MazidaBuilder implements CarBuilder {
    Part partA, partB, partC;

    
public void buildPartA() {
        
// 这里是具体如何构建partA的代码
        partA = ;
    }
;

    
public void buildPartB() {
        
// 这里是具体如何构建partB的代码
        partB = ;
    }
;

    
public void buildPartC() {
        
// 这里是具体如何构建partB的代码
        partC = ;
    }
;

    
public Product getResult() {
        
// 返回最后组装成品结果
        return new Product(partA,partB,partC);
    }

}

ConstructFactory: Builder模式的重要体现之二---产品组装工厂
// 建立产品组装工厂,用来实现构建复杂对象的过程。
class ConstructFactory {
    
// 工厂里有一个产品生成器
    private CarBuilder carBuilder;

    
public ConstructFactory(CarBuilder carBuilder) {
        
this.carBuilder = carBuilder;
    }


    
// 在这里实现部件的组装及汽车的组装。
    public void construct() {
        
// 组装部件A
        carBuilder.buildPartA();
        
// 组装部件B
        carBuilder.buildPartB();
        
// 组装部件C
        carBuilder.buildPartC();
    }
// 到此,汽车组装完毕。
}

Temple:
// 具体得到一个产品的过程
public static void main(String args[]){
    
// 建立产品生成器对象
    MazidaBuilder ma6Builder = new MazidaBuilder();
    
// 建立产品组装工厂,由工厂操作产品生成器进行组装。
    ConstructFactory cf = new ConstructFactory( ma6Builder ); 
    
// 开始组装。这里,改变工厂的组装过程,就可以组装成不同的产品。
    cf.construct(); 
    
// 组装完毕
    
// 从产品生成器中得到产品
    Product product = ma6Builder.getResult(); 
}

理解Builder模式,主要就是理解上面这几个过程。

Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。

欢迎来访!^.^!
本BLOG仅用于个人学习交流!
目的在于记录个人成长.
所有文字均属于个人理解.
如有错误,望多多指教!不胜感激!

Feedback

# re: GOF设计模式学习笔记(三)---Builder模式   回复  更多评论   

2007-05-18 09:01 by 大田斗
模式本身是一种思想?思想是用来指导的。究其目的,不过是在我们开发代码中提供一种套路。

# re: GOF设计模式学习笔记(三)---Builder模式   回复  更多评论   

2007-12-02 23:38 by lihe
public Product getResult() {
// 返回最后组装成品结果
return new Product(partA,partB,partC);
}
???
接口能 new???

# re: GOF设计模式学习笔记(三)---Builder模式 [未登录]  回复  更多评论   

2009-03-26 15:59 by alex
你对builder模式没有理解到精华之处,

同一个过程创造不同的表示,你应该细细体会一下

# re: GOF设计模式学习笔记(三)---Builder模式   回复  更多评论   

2009-06-02 14:26 by ads
你对builder的理解错误了

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


网站导航:
 

Copyright © 久城