设计模式-原型模式

原型模式Prototype):

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。



    原型模式(也就是平时说的克隆)其实就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。这个模式估计是最简单的了,其实就是在讲深复制和浅复制,而且很多语言直接就已经支持深复制了。这个模式应用的地方通常是复杂耗时的初始化,比如说硬件获取什么的,可以用于在缓存里做临时版本复制等等。非常简单,但并不是没有价值。下面我用C++简单模拟一下上面那个UML所说的。
原型模式实现代码:
#pragma once

#include <string.h>
#include <iostream>

using namespace std;

#pragma warning(disable:4996)

class CPrototypeInterface
{
public:
	virtual CPrototypeInterface * Clone() = 0;
	virtual void Show() = 0;
};

class CBodyA : public CPrototypeInterface
{
private:
	char m_cCache[1024];
	int m_nKey;
public:
	CBodyA()
	{
		memset(m_cCache ,sizeof(m_cCache) ,0);
		m_nKey = 0;
	}
	void SetCache(char cCache[])
	{
		strcpy(m_cCache ,cCache);
	}
	void SetKey(int nKey)
	{
		m_nKey = nKey;
	}
	void Show()
	{
		cout<<m_cCache<<":"<<m_nKey<<endl;
	}
	CPrototypeInterface * Clone()
	{
		CBodyA *pNewBody = new CBodyA();
		strcpy(pNewBody->m_cCache ,m_cCache);
		pNewBody->m_nKey = m_nKey;
		return pNewBody;
	}
};

class CBodyB : public CPrototypeInterface
{
private:
	char m_cCache[1024];
	int m_nKey;
public:
	CBodyB()
	{
		memset(m_cCache ,sizeof(m_cCache) ,0);
		m_nKey = 0;
	}
	void SetCache(char cCache[])
	{
		strcpy(m_cCache ,cCache);
	}
	void SetKey(int nKey)
	{
		m_nKey = nKey;
	}
	void Show()
	{
		cout<<m_cCache<<":"<<m_nKey<<endl;
	}
	CPrototypeInterface * Clone()
	{
		CBodyB *pNewBody = new CBodyB();
		strcpy(pNewBody->m_cCache ,m_cCache);
		pNewBody->m_nKey = m_nKey;
		return pNewBody;
	}
};

客户端调用代码:
// TTT.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Prototype.h"
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
	CPrototypeInterface *pHashMemory[10] = {0};
	int nHashId = 0;

	CBodyA *pBodyA = new CBodyA();
	pBodyA->SetCache("AAAAA");
	pBodyA->SetKey(1);

	CBodyB *pBodyB = new CBodyB();
	pBodyB->SetCache("BBBBB");
	pBodyB->SetKey(2);

	CPrototypeInterface *pBodyAA = pBodyA->Clone();
	pBodyAA->Show();
	CPrototypeInterface *pBodyBB = pBodyB->Clone();
	pBodyBB->Show();
	
	delete pBodyA;
	delete pBodyB;
	delete pBodyAA;
	delete pBodyBB;
	return 0;
}

运行结果:

比较简答,就不多说了。



原文地址:https://www.cnblogs.com/csnd/p/12062351.html