以下是我自己学习设计模式的感想。
原型模式
学过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