一:建造者模式
所謂建造者模式,就是通過不同對象去創建一個復雜的類。
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 本身就是“對象工廠” (因為能夠生產對象) ,實際上 Prototype 模式和 Builder 模式、
AbstractFactory 模式都是通過一個類(對象實例)來專門負責對象的創建工作(工廠對象) ,它們之間的區別是:Builder 模式重在復雜對象的一步步創建(並不直接返回對象) ,AbstractFactory 模式重在產生多個相互依賴類的對象,而 Prototype 模式重在從自身復制自
己創建新類。