zoukankan      html  css  js  c++  java
  • 设计模式-原型模式

    原型模式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;
    }
    

    运行结果:

    比较简答,就不多说了。



  • 相关阅读:
    【转载】用opencv中的CvEM做GMM的训练
    关于OpenCV做图像处理内存释放的一些问题
    关于C++ vector的拷贝
    VS2015创建的C++程序在Debug模式下不能调试
    OpenCV中IplImage和Mat间的相互转换
    视频资源下载方法[download video resources]
    关于win10安装VisualSVN遇到的一个问题及解决办法
    win7启动出现蓝屏STOP: 0X0000007B
    CentOS下挂在NTFS分区
    硬盘类型和Linux的分区
  • 原文地址:https://www.cnblogs.com/csnd/p/12062350.html
Copyright © 2011-2022 走看看