用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。其中有一個詞很重要,那就是拷貝。可以說,拷貝是原型模式的精髓所在。舉個現實中的例子來介紹原型模式。找工作的時候,我們需要準備簡歷。假設沒有打印設備,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷,如果要修改簡歷中的某項,那麼所有已寫好的簡歷都要修改,工作量很大。隨着科技的進步,出現了打印設備。我們只需手寫一份,然後利用打印設備複印多份即可。如果要修改簡歷中的某項,那麼修改原始的版本就可以了,然後再複印。原始的那份手寫稿相當於是一個原型,有了它,就可以通過複印(拷貝)創造出更多的新簡歷。這就是原型模式的基本思想。
二、UML圖:
優點:複製自身。客戶不知道需要對象的實際類型,只需知道它的抽象基類即可。(即有繼承樹的情況)
缺點:必須先有一個對象實例(即原型)才能clone。
四、代碼實現:
#include <cstdio>
//接口
class CPrototype
{
public:
CPrototype(){}
virtual ~CPrototype(){}
virtual CPrototype* Clone() = 0;
};
//實現
class CConcretePrototype : public CPrototype
{
public:
CConcretePrototype():m_counter(0){}
virtual ~CConcretePrototype(){}
//拷貝構造函數
CConcretePrototype(const CConcretePrototype& rhs)
{
m_counter = rhs.m_counter;
}
//複製自身
virtual CPrototype* Clone()
{
//調用拷貝構造函數
return new CConcretePrototype(*this);
}
private:
int m_counter;
};
int main(int argc, char **argv)
{
//生成對像
CPrototype* conProA = new CConcretePrototype();
//複製自身
CPrototype* conProB = conProA->Clone();
delete conProA; conProA=NULL;
delete conProB; conProB=NULL;
return 0;
}
五、綜述:
Prototype模式同工廠模式,同樣對客戶隱藏了對象的創建工作.
但是,與通過對一個類進行實例化來構造新對象不同的是,原型模式是通過拷貝一個現有對象生成新對象的,
達到了"隔離類對象的使用者和具體類型(易變類)之間的耦合關係"的目的.
原型模式可以很方便的快速構建相同類型的對象.其構造過程有點類似細胞分裂.通過原型模式的克隆接口克隆對象,我們可以完全不關心待克隆對象本身的類型,只需要調用接口就可以產生一個新的同類對象.