以下是我自己學習設計模式的感想。
原型模式
學過C++的都知道拷貝構造函數,復制一個對象分為淺拷貝和深拷貝。
淺拷貝:就是給對象中的每個成員變量進行復制,就是把A1類中的變量直接賦給A2類中變量,屬於值傳遞,但是涉及到有new之類內存分配的地方,他們卻是共享內存的。
深拷貝:就是不僅使用值傳遞,而是要每個變量都有自己一份獨立的內存空間,互不干擾。
默認的拷貝構造函數是淺拷貝的,如果要實現深拷貝,就需要重寫拷貝構造函數T(const T&)。
既然有了拷貝構造函數,還要引入原型模式呢?根據我自己查閱資料之后,我覺得好像是面向對象語言中都是引用傳遞,而且只提供簡單的淺拷貝,所以沒有拷貝構造函數這么一說,於是要實現深拷貝的功能,就需要原型模式。不知道這個想法對不對,歡迎指正。
常用場景
基本就是你需要從A的實例得到一份與A內容相同,但是又互不干擾的實例的話,就需要使用原型模式。
優點
1.使用拷貝模式比直接new一個對象的開銷要小的多。
2.可以在程序運行時(對象屬性發生了變化),得到一份內容相同的實例,但之間還不會相互干擾。
缺點
C++實現
#ifndef _PROTOTYPE_H_ #define _PROTOTYPE_H_ class Prototype{ public: Prototype(); virtual ~Prototype(); virtual Prototype* clone() = 0; }; class ConcretePrototype:public Prototype{ public: ConcretePrototype(); ~ConcretePrototype(); Prototype* clone(); private: ConcretePrototype(const ConcretePrototype&); }; #endif
#include "Prototype.h" #include <stdio.h> Prototype::Prototype() { } Prototype::~Prototype() { } ConcretePrototype::ConcretePrototype() { } ConcretePrototype::~ConcretePrototype() { } ConcretePrototype::ConcretePrototype(const ConcretePrototype& c) { fprintf(stderr,"ConcretePrototype copy construct!\n"); } Prototype* ConcretePrototype::clone() { return new ConcretePrototype(*this); }
#include "Prototype.h" int main() { Prototype* p = new ConcretePrototype(); Prototype* a = p->clone(); return 0; }
g++ -o client client.cpp Prototype.cpp