设置模式之builder模式

Builder模式是应用最多的模式之一,因为我们在处理很多事情的时候,都需要很多其他的事情进行组合才能够完成。在《设计模式》一书中讲到,对于builder模式的使用范围主要是在:当需要将对象的创建过程和展示过程进行分离的时候,就需要用到builder模式。

       听到这个概念,我第一反应就是MVC架构,因为在MVC架构中,也是需要将创建或者说设计和界面分开。当然,builder模式中的展示部分肯定不是单单指UI界面。但是,这样的一种分离思想肯定有或多或少的雷同。

       同时,builder模式还有一个目的,是为了在相同的创建过程中可以产生不同的表示结果。这个目的其实和工厂模式有很大的相同点,工厂模式中也是在创建过程中,为了下游的产品的多样性而设计的一种方式。不过想比较而言,builder模式更加注重一个创建过程的步骤话,而工厂方法模式,则是更加注重一个结果的返回。关于这一点,还是不是很好区分。

       关于builder模式的适用性有一个相对较为精确的描述,主要分成两点,我也感觉这两点是能够真正落实而非理论上的一种描述。

1.      当创建复杂对象的算法应该独立于该对象的组成部分和装配方式。

2.      当构造过程中对象必须有不同的表示。

关于第一点,之前在工厂方法中的所有模式都没有提及这个,工厂方法模式主要是应用于对产品的一个规模化生产的良好的规划。对于本身产品是不会对其进行分布创建的,即使是需要分布的,这个也不属于工厂模式的范畴,这就已经属于builder的范畴内了!

       上述两点所要表达的意思是,但我们创建的对象变得比较复杂的时候,我们应该将对象的创建过程和对象的展示部分分开。Builder模式最重要的作用在于相同的创建过程却可以产生不同的创建结果,这是因为每一个创建步骤都能够返回对象。举个具体的例子说明这个过程吧。

       例如:在一个生产鞋子的工厂中,对于生产鞋子的这个过程而言,都会要经历生产鞋根、鞋面、鞋带、打上商标等等这一系列的过程。

       而生产过程中,当然不可能将这些过程都进行一个封装,那样的话,生产出来的鞋子就太单一了。要保证鞋子的多样性,该怎么办呢??那么当然在每一个生产和创建的子过程中要产生不同的结果了啊!

       Builder所起到的作用就是将这些每一个子系统创建过程进行一次的整合,然后生成所要的产品。

       在这,在builder模式中,还有一个概念,director。作为director是不会参与具体的产品的实现的,但是他设计一个完整的产品的,产品的每个部分都会由builder来实现。简单来表示三者之间的联系,如图所示。

Director部分虽然不参与整个实现的过程,但是它是用来控制客户想要的产品的一个环节,因此,真正的设计控制部分在director。当理解到了这个地方的时候,感觉builder的大部分东西已经可以掌握了。举一个实际的程序示例。

这一段是 product的头文件。用以控制和实现产品的生产过程。

   

    #pragma once
//零件
class productOne
{
public:
    productOne(void);
    virtual ~productOne(void);
public:
    virtual int CreateOne()  =0;
};
//零件
class productTwo
{
public:
    productTwo();
    virtual ~productTwo(void);
public:
    virtual int CreateTwo()  =0;
};
//零件
class productThree
{
public:
    productThree(void);
    virtual ~productThree(void);
public:
    virtual int CreateThree()=  0;
};
//零件的多种实现方式
class productOneStytleone:publicproductOne
{
public:
    productOneStytleone(void);
    virtual ~productOneStytleone();
public:
    int CreateOne();
};
//零件的多种实现方式
class productTwoStytleone:publicproductTwo
{
public:
    productTwoStytleone(void);
    virtual ~productTwoStytleone();
public:
    int CreateTwo();
};
//例如具有防水功能的该零件
class productTwoStytlewater:publicproductTwo
{
public:
    productTwoStytlewater(void);
    ~productTwoStytlewater();
public:
    int CreateTwo();
};
//零件的多种实现方式
class productThreeStytlehigh:publicproductThree
{
public:
    productThreeStytlehigh(void);
    ~productThreeStytlehigh(void);
public:
    int CreateThree();
};
//这一段则是director的头文件,用来实现builder模式中的director的角色。
#pragma once
class productOne;
class productTwo;
class productThree;
class director
{
public:
    director(void);
    ~director(void);
public:
    void CreateProduct();
private:
    productOne *pOne;
    productTwo *pTwo;
    productThree *pThree;
};

最后的实现效果为:



从上面的这个部分可以看得出,在builder模式中最为重要的几个部分分别是:product、builder、director三个部分。尤其是director是builder模式区别于其他模式的一个最重要的部分。

虽然写了以上总结,但是还有很多地方没有搞清,这里突然想起了一个高手写的博客,

http://www.iteye.com/topic/71175。当时也是从这个博客中知道这个模式的真正含义,所谓builder模式的最大特点,就是用户已经脱离了具体的生产细节,而director也脱离了实现过程,但是client可以从director处直接要到产品。具体的实现过程交由builder来完成,director就是用来将所有的实现的零件来进行搭建拼凑成一个完整的商品的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值