原型模式本質上說就是對當前數據進行復制。就像變戲法一樣,一個鴿子變成了兩個鴿子,兩個鴿子變成了三個鴿子,就這麼一直變下去。在變的過程中,我們不需要考慮具體的數據類型。為什麼呢?因為不同的數據有自己的復制類型,而且每個復制函數都是虛函數。
用C++怎麼編寫呢,那就是先寫一個基類,再編寫一個子類。就是這麼簡單。
- class data
- {
- public:
- data () {}
- virtual ~data() {}
- virtual class data* copy() = 0;
- };
-
- class data_A : public data
- {
- public:
- data_A() {}
- ~data_A() {}
- class data* copy()
- {
- return new data_A();
- }
- };
-
- class data_B : public data
- {
- public:
- data_B() {}
- ~data_B() {}
- class data* copy()
- {
- return new data_B();
- }
- };
那怎麼使用呢?其實只要一個通用的調用接口就可以了。
- class data* clone(class data* pData)
- {
- return pData->copy();
- }
就這麼簡單的一個技巧,對C來說,當然也不是什麼難事。
- typedef struct _DATA
- {
- struct _DATA* (*copy) (struct _DATA* pData);
- }DATA;
假設也有這麼一個類型data_A,
- DATA data_A = {data_copy_A};
既然上面用到了這個函數,所以我們也要定義啊。
- struct _DATA* data_copy_A(struct _DATA* pData)
- {
- DATA* pResult = (DATA*)malloc(sizeof(DATA));
- assert(NULL != pResult);
- memmove(pResult, pData, sizeof(DATA));
- return pResult;
- };
使用上呢,當然也不含糊。
- struct _DATA* clone(struct _DATA* pData)
- {
- return pData->copy(pData);
- };