当前位置:编程学习 > C/C++ >>

c++ 设计模式之生成器模式

个人感觉这个模式,使用的应该较少,主要应用于流程性的东西,废话不多说,让我们进入生成器模式。

意图:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性:

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

2、当构造过程必须允许被构造的对象有不同的表示时

使用生成器模式的基本方法:

1、需要抽象出一个基类,所有的对象创建时,都继承自这个基类创建。

2、需要创建一个调用的导演,由它来多态到不同的表现。(它并不继承自那个抽象基类,而是存储一个抽象基类的指针,类似多态)。

3、各个具体对象实例化基类的接口

看一个生成器模式的基本结构例子,本例子从http://www.cppblog.com/converse/archive/2006/07/21/10305.html,整理,仅供学习使用:

builder.h

//设计模式之builder模式  
/*
作用:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示
*/ 
//虚拟基类,所有builder的基类,提供不同部分的构建接口  
class builder 

public: 
    builder(){}; 
    virtual ~builder(){}; 
 
    //提供构建接口  
    virtual void builderA() = 0; 
    virtual void builderB() = 0; 
}; 
 
//使用builder构建产品,构建产品的过程都一致,但是不同的builder会有不同的表现  
//这个不同的实现通过不同的builder派生类来实现,存有一个builder的指针,多态调用  
class director 
{//  
public: 
    director(builder *pbuilder); 
    virtual ~director(); 
 
    void construct(); 
private: 
    builder *pBuilder; 
}; 
//具体实例化各个建造者  
class concretebuilder1:public builder 

public: 
    concretebuilder1(){} 
    virtual ~concretebuilder1(){} 
    virtual void builderA(); 
    virtual void builderB(); 
}; 
//具体实例化各个建造者  
class concretebuilder2:public builder 

public: 
    concretebuilder2(){} 
    virtual ~concretebuilder2(){} 
 
    virtual void builderA(); 
    virtual void builderB(); 
}; 
//设计模式之builder模式
/*
作用:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示
*/
//虚拟基类,所有builder的基类,提供不同部分的构建接口
class builder
{
public:
 builder(){};
 virtual ~builder(){};

 //提供构建接口
 virtual void builderA() = 0;
 virtual void builderB() = 0;
};

//使用builder构建产品,构建产品的过程都一致,但是不同的builder会有不同的表现
//这个不同的实现通过不同的builder派生类来实现,存有一个builder的指针,多态调用
class director
{//
public:
 director(builder *pbuilder);
 virtual ~director();

 void construct();
private:
 builder *pBuilder;
};
//具体实例化各个建造者
class concretebuilder1:public builder
{
public:
 concretebuilder1(){}
 virtual ~concretebuilder1(){}
 virtual void builderA();
 virtual void builderB();
};
//具体实例化各个建造者
class concretebuilder2:public builder
{
public:
 concretebuilder2(){}
 virtual ~concretebuilder2(){}

 virtual void builderA();
 virtual void builderB();
};
 

builder.cpp

#include "builder.h"  
#include <stdio.h>  
 
void concretebuilder1::builderA() 

    printf("builderA by concretebuilder1\n"); 

 
void concretebuilder1::builderB() 

    printf("builderB by concretebuilder1\n"); 

 
void concretebuilder2::builderA() 

    printf("builderA by concretebuilder2\n"); 

 
void concretebuilder2::builderB() 

    printf("builderB by concretebuilder2\n"); 

 
director::director(builder *pbuilder) 

    this->pBuilder = pbuilder; 

director::~director() 

    delete pBuilder; 
    pBuilder = NULL; 

 
void director::construct() 

    //将同一个过程的表示组装一下  
    pBuilder->builderA(); 
    pBuilder->builderB(); 

 
 
void main() 

    //调用时,需要注意一下,具体想创建哪个表示,就实例化哪个  
    builder *pbuilder1 = new concretebuilder1; 
    //通过导演,可以将表示提取出来  
    director *pdirector = new director(pbuilder1); 
    //具体操作,就可以由导演代劳了。  
    pdirector->construct(); 
 
    builder *pbuilder2 = new concretebuilder2; 
    director *pdirector2 = new director(pbuilder2); 
    pdirector2->construct(); 
 
    delete pdirector; 
    delete pdirector2; 
 

#include "builder.h"
#include <stdio.h>

void concretebuilder1::builderA()
{
 printf("builderA by concretebuilder1\n");
}

void concretebuilder1::builderB()
{
 printf("builderB by concretebuilder1\n");
}

void concretebuilder2::builderA()
{
 printf("builderA by concretebuilder2\n");
}

void concretebuilder2::builderB()
{
 printf("builderB by concretebuilder2\n");
}

director::director(builder *pbuilder)
{
 this->pBuilder = pbuilder;
}
director::~director()
{
 delete pBuilder;
 pBuilder = NULL;
}

void director::construct()
{
 //将同一个过程的表示组装一下
 pBuilder->builderA();
 pBuilder->builderB();
}


void main()
{
 //调用时,需要注意一下,具体想创建哪个表示,就实例化哪个
 builder *pbuilder1 = new concretebuilder1;
 //通过导演,可以将表示提取出来
 director *pdirector = new director(pbuilder1);
 //具体操作,就可以由导演代劳了。
 pdirector->construct();

 builder *pbuilder2 = new concretebuilder2;
 director *pdirector2 = new director(pbuilder2);
 pdirector2->construct();

 delete pdirector;
 delete pdirector2;

}
 

分析代码的时候主要看类的结构关系,以及具体的使用方法。

下面让我们看一个具体的例子。

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,