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;
    }
    

    运行结果:

    比较简答,就不多说了。



  • 相关阅读:
    聊聊LiteOS事件模块的结构体、初始化及常用操作
    有了这个数据强一致“利器”,DBA们轻松修复数据对加班“say no”
    开源一周岁,MindSpore新特性巨量来袭
    90后就敢当扫地僧!不服?4月24号来闯龙门阵!
    你的数仓函数结果不稳定,可能是属性指定错了
    云小课 | 不了解EIP带宽计费规则?看这里!
    腾讯 angel 3.0:高效处理模型
    深度树匹配模型(TDM)
    X-Deep Learning功能模块
    XLearning
  • 原文地址:https://www.cnblogs.com/csnd/p/12062350.html
Copyright © 2011-2022 走看看