您的位置:首页 > 编程语言 > C语言/C++

几种创建型的设计模式概析【下】——Builder模式,ProtoType模式【C++实现】

2011-03-14 13:40 549 查看
Bulider模式和AbstractFactory模式在功能上有些相似,都是负责管理创建复杂对象的组件。与AbstractFactory模式不同的是,Builder模式是将一个对象的创建分成几个小部分,然后一步一步的进行对象的创建;Builder就是在创建的对象的过程中做文章,通过对不同的步骤传入不同的参数,最后得到不同的创建过程。而AbstractFactory模式不会在创建过程中做文章,它所创建的对象过程也没有先后必然的次序关系,而是一次性创建成功。举个例子来说:不同的汽车汽车有很多组件,方向盘,座椅,刹车踏板;用AbstractFactory模式创建这些对象时,可将其再细继承两个子类,一个创建货车的组件,一个创建小汽车的组件,在AbstractFactory中提供抽象接口;而用Builder模式时,Builder类虽然同样封装了创建对象的过程,但是在创建的过程中通过指定不同的参数(货车,小汽车)来创建不同的组件,生产出来的同样是汽车组件,而因为在创建过程中传递了不同参数,导致创建结果有微小差异。Builder模式的UML图如下:



上图代码实现如下:

#include <iostream>
#include <string>
using namespace std;
class Product
{
public:
Product()
{}
~Product()
{}
};
class Builder
{
protected:

Builder()
{}
~Builder()
{}
public:
virtual void  CreatePartA( const string & str)=0;
virtual void  CreatePartB( const string & str)=0;
virtual void  CreatePartC( const string & str)=0;

};
class ConcreteBuilder:public Builder
{
public:
ConcreteBuilder()
{}
~ConcreteBuilder()
{}
void CreatePartA(const string & str);
void CreatePartB(const string & str);
void CreatePartC(const string & str);
};
void ConcreteBuilder::CreatePartA(const string & str)
{
cout<<str<<endl;
}
void ConcreteBuilder::CreatePartB(const string & str)
{
cout<<str<<endl;
}
void ConcreteBuilder::CreatePartC(const string & str)
{
cout<<str<<endl;
}
class Director
{
public:
Director(Builder *bld)
{
_bld=bld;
}
~Director()
{}
void Construct();
private:
Builder *_bld;
};
void Director::Construct()
{
string str;
str="Builder PartA";
_bld->CreatePartA(str);
str="Builder PartB";
_bld->CreatePartB(str);
str="Builder PartC";
_bld->CreatePartC(str);
}
int main()
{
Director *drt=new Director(new ConcreteBuilder());

drt->Construct();

return 0;
}


ProtoType模式比较简单易用,通常当我们需要创建一个和已有对象一摸一样的对象时,就需要用到这个模式,说到这,很多人可能会想到可以通过拷贝构造函数来实现这种功能。没错!ProtoType的原理就是在拷贝构造函数上下功夫,通过对象的自我拷贝构造来实现之。其UML图示如下:



上图代码实现如下:

#include <iostream>
#include <string>
using namespace std;
class ProtoType
{
protected:
ProtoType()
{}
~ProtoType()
{}
public:
virtual ProtoType* Clone()=0;
};
class ConcreteProtoType:public ProtoType
{
public:
ConcreteProtoType()
{}
~ConcreteProtoType()
{}
ConcreteProtoType(const ConcreteProtoType & pro);
ProtoType* Clone();
};
ConcreteProtoType::ConcreteProtoType(const ConcreteProtoType &pro)
{
cout<<"ConcreteProtoType..."<<endl;
}
ProtoType *ConcreteProtoType::Clone()
{
return new ConcreteProtoType(*this);
}
int main()
{
ProtoType *pro1=new ConcreteProtoType();
ProtoType *pro2=pro1->Clone();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: