原型模式及C++实现

时间:2022-10-06 06:20:14

以下是我自己学习设计模式的感想。

原型模式

学过C++的都知道拷贝构造函数,复制一个对象分为浅拷贝和深拷贝。

浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1类中的变量直接赋给A2类中变量,属于值传递,但是涉及到有new之类内存分配的地方,他们却是共享内存的。

深拷贝:就是不仅使用值传递,而是要每个变量都有自己一份独立的内存空间,互不干扰。

默认的拷贝构造函数是浅拷贝的,如果要实现深拷贝,就需要重写拷贝构造函数T(const T&)。

既然有了拷贝构造函数,还要引入原型模式呢?根据我自己查阅资料之后,我觉得好像是面向对象语言中都是引用传递,而且只提供简单的浅拷贝,所以没有拷贝构造函数这么一说,于是要实现深拷贝的功能,就需要原型模式。不知道这个想法对不对,欢迎指正。

原型模式及C++实现

常用场景

基本就是你需要从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

运行的结果

原型模式及C++实现