原型模式及C++實現


以下是我自己學習設計模式的感想。

原型模式

學過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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM