定義
用原型(prototype
)例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
結構
理解
1.prototype
是原型基類,提供clone
純虛方法,它根據不同的派生類來轉殖不同的物件。
2.concreteprototype
是原型具體類。實現clone
方法,轉殖自己,返回轉殖後的新物件。
3.client
呼叫基類clone
介面,就可以得到乙個轉殖物件。
要點
1.原型模式中,client
並不知道要轉殖物件的實際型別,只需知道基類型別即可。 2.
轉殖物件比直接建立物件的優點在於,轉殖是將原有物件的行為屬性帶到了新的物件中。
3.c++
沒有轉殖方法,要轉殖乙個物件,需要借助拷貝建構函式(copy constructor
)來實現。拷貝建構函式中實現拷貝物件有淺拷貝和深拷貝:
淺拷貝是指物件複製時,只是對於物件中的資料成員進行值拷貝;深拷貝是指物件賦值時,對於物件的簡單資料成員進行值拷貝,對於物件中的動態成員(堆或者其他系統資源),要重新分配動態空間。
當類不定義拷貝建構函式的時候,編譯器會自動生乙個建構函式,叫做預設拷貝建構函式。預設拷貝建構函式使用淺拷貝方式。如果類中含有動態資料成員,就必須使用深拷貝方式實現拷貝建構函式,否則,在銷毀物件時,兩個物件的析構函式將對同乙個記憶體空間釋放兩次,產生執行時錯誤。
應用
原始碼中,line
是原型基類,具體轉殖類是直線和曲線。
原始碼
#include
#include
using
namespace
std; //
原型基類
. 線條
class
clineprototype;
virtual
clineprototype* clone() = 0; };
//原型具體類
. 直線
class
cbeelineprototype : public
clineprototype;
//拷貝建構函式
cbeelineprototype(const
cbeelineprototype &o)
virtual ~cbeelineprototype(){};
virtual
clineprototype* clone()
void
setweight(const
int &iweight)
void
print()
protected:
intm_iweight; };
//原型具體類
. 曲線
class
ccurveprototype : public
clineprototype;
//拷貝建構函式
ccurveprototype(const
ccurveprototype &o)
virtual ~ccurveprototype(){};
virtual
clineprototype* clone()
void
settype(const
string &m_strtype)
void
print()
protected:
string
m_strtype; };
//client
clineprototype
* clone(clineprototype* pprototype)
intmain()
輸出:
clone a line
beeline weight: 10
clone a curve
beeline type: dot
c 設計模式(原型模式)
good 從乙個物件再建立另外乙個可定製的物件,而無需知道任何建立的細節。並能提高建立的效能。說白了就copy技術,把乙個物件完整的copy出乙份。例 include include include using namespace std class prototype 抽象基類 prototype...
C 設計模式 原型模式
用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。建立型模式中乙個比較特殊的模式 原型模式,有個最大的特點是轉殖乙個現有的物件,這個轉殖的結果有2種,一種是淺度複製,另一種是深度複製。建立型模式一般是用來建立乙個新的物件,然後我們使用這個物件完成一些物件的操作,我們通過原型模式可以快速...
C 設計模式 原型模式
所謂原型模式就是用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。舉乙個簡單的例子,乙個人想要批量分發自己的名片,然而名片千篇一律,只是偶爾修改一些地方,但需求量大,所以需要不斷例項化名片類,十分麻煩,所以這就有了原型模式。原型模式旨在以某一類為原型,利用clone成員函式不斷拷貝出新...