原型模式(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;
}
运行结果:
比较简答,就不多说了。