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

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: 复杂对象接口。我们最终就是为了得到它的一个对象。我叫它产品

None.gif //  这里有一个复杂对象接口Product。它的构建需要PartA,PartB,PartC。
ExpandedBlockStart.gifContractedBlock.gif
public   interface  Product dot.gif {
InBlock.gif    
public Product(Part partA, Part partB, Part partC);
ExpandedBlockEnd.gif}


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

None.gif //  复杂对象部件接口Part。
ExpandedBlockStart.gifContractedBlock.gif
public   interface  Part dot.gif {
InBlock.gif    
//dot.gif
ExpandedBlockEnd.gif
}

CarBuilder: 复杂对象的构建接口。Builder模式的重要体现之一--- 产品生成器
None.gif //  这里定义一个产品生成器接口。
ExpandedBlockStart.gifContractedBlock.gif
public   interface  CarBuilder  dot.gif {
InBlock.gif    
// 创建部件A
InBlock.gif
    void buildPartA();
InBlock.gif
InBlock.gif    
// 创建部件B
InBlock.gif
    void buildPartB();
InBlock.gif
InBlock.gif    
// 创建部件C
InBlock.gif
    void buildPartC();
InBlock.gif
InBlock.gif    
// 返回产品,不用的组装过程会返回不同的产品。
InBlock.gif
    Product getResult();
ExpandedBlockEnd.gif}

MazidaBuilder: 具体的 产品生成器对象
None.gif //  实现具体的产品生成器
ExpandedBlockStart.gifContractedBlock.gif
public   class  MazidaBuilder  implements  CarBuilder  dot.gif {
InBlock.gif    Part partA, partB, partC;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void buildPartA() dot.gif{
InBlock.gif        
// 这里是具体如何构建partA的代码
InBlock.gif
        partA = dot.gif;
ExpandedSubBlockEnd.gif    }
;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void buildPartB() dot.gif{
InBlock.gif        
// 这里是具体如何构建partB的代码
InBlock.gif
        partB = dot.gif;
ExpandedSubBlockEnd.gif    }
;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void buildPartC() dot.gif{
InBlock.gif        
// 这里是具体如何构建partB的代码
InBlock.gif
        partC = dot.gif;
ExpandedSubBlockEnd.gif    }
;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Product getResult() dot.gif{
InBlock.gif        
// 返回最后组装成品结果
InBlock.gif
        return new Product(partA,partB,partC);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

ConstructFactory: Builder模式的重要体现之二--- 产品组装工厂
None.gif //  建立产品组装工厂,用来实现构建复杂对象的过程。
ExpandedBlockStart.gifContractedBlock.gif
class  ConstructFactory  dot.gif {
InBlock.gif    
// 工厂里有一个产品生成器
InBlock.gif
    private CarBuilder carBuilder;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public ConstructFactory(CarBuilder carBuilder) dot.gif{
InBlock.gif        
this.carBuilder = carBuilder;
ExpandedSubBlockEnd.gif    }

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

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

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

Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值