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

原型模式

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

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

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

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

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

image

 

常用场景

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

 

运行的结果

image

posted on 2013-06-23 20:05  曾经的你|  阅读(10910)  评论(2编辑  收藏  举报