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

建造者模式和原型模式

一:建造者模式
 
所谓建造者模式,就是通过不同对象去创建一个复杂的类。
 
Builder 模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成) ,我们要要复杂对象的创建过程和这个对象的表示(展示)分
离开来, 这样做的好处就是通过一步步的进行复杂对象的构建, 由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样
 
 
先看看类图:
\
 
 
 
代码例子:(假设其中的鸡翅、汉堡、可乐等是已经有了的类)
 
 
[cpp] 
#include<iostream>   
#include<string>   
#include<vector>   
using namespace std;  
  
class TaoCan  
{  
public:  
    TaoCan(){}  
    ~TaoCan(){}  
  
    vector<string>v;  
};  
  
class Builder  
{  
  
public:  
    Builder(){}  
    ~Builder(){}  
  
    void addfood(string foodname)  
    {  
        tc.v.push_back(foodname);  
    }  
  
    void create()  
    {  
        cout<<"套餐由以下食物组成"<<endl;  
        for(vector<string>::iterator iter=tc.v.begin();iter!=tc.v.end();++iter)  
        {  
            cout<<*iter<<" ";  
          
        }  
    }  
  
private:  
    TaoCan tc;  
};  
  
int main()  
{  
    //顾客告诉服务员,服务员告诉Builder,这里将服务员和Builder合成一个   
    //顾客告诉服务员要:汉堡、鸡翅、可乐、薯条。   
    //于是...   
    Builder *b=new Builder();  
    b->addfood("汉堡");  
    b->addfood("鸡翅");  
    b->addfood("可乐");  
    b->addfood("薯条");  
  
    b->create();  
  
    system("pause");  
    return 0;  
}  
 
#include<iostream>
#include<string>
#include<vector>
using namespace std;
 
class TaoCan
{
public:
TaoCan(){}
~TaoCan(){}
 
vector<string>v;
};
 
class Builder
{
 
public:
Builder(){}
~Builder(){}
 
void addfood(string foodname)
{
tc.v.push_back(foodname);
}
 
void create()
{
cout<<"套餐由以下食物组成"<<endl;
for(vector<string>::iterator iter=tc.v.begin();iter!=tc.v.end();++iter)
{
cout<<*iter<<" ";
 
}
}
 
private:
TaoCan tc;
};
 
int main()
{
//顾客告诉服务员,服务员告诉Builder,这里将服务员和Builder合成一个
//顾客告诉服务员要:汉堡、鸡翅、可乐、薯条。
//于是...
Builder *b=new Builder();
b->addfood("汉堡");
b->addfood("鸡翅");
b->addfood("可乐");
b->addfood("薯条");
 
b->create();
 
system("pause");
return 0;
}
 
二:原型模式 
 
Prototype 模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。
 
 
类图如下:
\
 
 
 
原型模式,说白了就是用一个对象去初始化另一个对象,达到了复制的效果。
 
例子代码如下:
 
 
[cpp] 
#include<iostream>   
#include<string>   
#include<vector>   
using namespace std;  
class YuanXing  
{  
public:  
    YuanXing(){}  
    ~YuanXing(){}  
  
    virtual YuanXing* clone()=0;  
};  
  
class JuTiYuanXing:public YuanXing  
{  
public:  
    JuTiYuanXing(){}  
    JuTiYuanXing(JuTiYuanXing &m)  
    {  
        *this=m;  
    }  
    ~JuTiYuanXing(){}  
  
    JuTiYuanXing*  clone()  
    {  
        return new JuTiYuanXing(*this);  
    }  
};  
int main()  
{  
      
    JuTiYuanXing *aa=new JuTiYuanXing;  
    JuTiYuanXing *bb=aa->clone();  
    system("pause");  
    return 0;  
}  
 
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class YuanXing
{
public:
YuanXing(){}
~YuanXing(){}
 
virtual YuanXing* clone()=0;
};
 
class JuTiYuanXing:public YuanXing
{
public:
JuTiYuanXing(){}
JuTiYuanXing(JuTiYuanXing &m)
{
*this=m;
}
~JuTiYuanXing(){}
 
JuTiYuanXing*  clone()
{
return new JuTiYuanXing(*this);
}
};
int main()
{
 
JuTiYuanXing *aa=new JuTiYuanXing;
JuTiYuanXing *bb=aa->clone();
system("pause");
return 0;
}
Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂” (因
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,