设计模式之原型模式,C++实现

原创:http://blog.csdn.net/iuhsihsow


其实个人觉得原型模式在C++也就那样吧。反正设计一个类,如果有需要都会重载=或者设置深拷贝函数。


所以就简单写一下吧。


示意图,UML还是不太会


代码:

#include "stdafx.h"
 #include <memory.h>
 #include <stdio.h>
 #include <string.h>
 #include <locale.h>
 #include <iostream>
 
 
 
 
 // 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节
 
 
 // 问1:和deepCopy有什么区别?重载"="或者写一个DeepCopy函数就可以了嘛?
 // 问2:貌似没有最大限度的节省内存,要节省内存是不是要用享元模式?
 // 问3:C++里面可没有什么MemberwiseClone()
 
 
 
 // 假设情景,某游戏,当用户新建角色时,会出现一个基础角色,
 // 然后用户再在此基础上对该基础角色进行修改
 // (其实应该是根据玩家的性别,身形选择,大致创建一个基础的角色外形,然后由玩家装扮,本处简化)
 
 // char *纯粹是用于深拷贝
 
 #define DELETE_OBJECT(p)	{ if (p) delete p;	p = NULL; }
 
 enum ESex
 {
 	male,
 	famale
 };
 
 class IRole
 {
 public:
 	virtual void Setproperty(ESex eSex, int nAge) = 0;
 	virtual void SetDescription(char * pDescpt, int nLength) = 0;
 	virtual void Show() = 0;
 	virtual IRole* Clone() = 0;
 	virtual void SetName(const std::string &strName) = 0;
 
 protected:
 	std::string m_strName;
 	ESex		m_eSex;
 	int			m_nAge;
 	char*		m_pDescription;
 	int			m_nDscriptLength;
 
 };
 
 class BaseRole : public IRole
 {
 public:
 	BaseRole()
 		//: m_eSex(male)
 		//, m_nAge(25)
 		//, m_pDescription(NULL)
 	{
 		m_eSex = male;
 		m_nAge = 25;
 		m_pDescription = NULL;
 	}
 	virtual ~BaseRole()
 	{
 		DELETE_OBJECT(m_pDescription);
 	}
 
 	void SetName(const std::string &strName)
 	{
 		m_strName = strName;
 	}
 	void Setproperty(ESex eSex, int nAge)
 	{
 		m_eSex = eSex;
 		m_nAge = nAge;
 	}
 	void SetDescription(char * pDescpt, int nLength)
 	{
 		m_nDscriptLength = nLength;
 		m_pDescription = new char[nLength + 1];
 		memset(m_pDescription, 0, nLength + 1);
 		memcpy(m_pDescription, pDescpt, nLength);
 	}
 	void Show()
 	{
 		printf("\n\nNow Show A Role Information:\n");
 		printf("Name:%s\n", m_strName.c_str());
 		if (male == m_eSex)
 		{
 			printf("Sex: Male\n");
 		}
 		else
 		{
 			printf("Sex: FeMale\n");
 		}
 		printf("Age :%d\n", m_nAge);
 		printf(m_pDescription);
 		printf("\n");
 	}
 	IRole* Clone()
 	{
 		BaseRole * pRole = new BaseRole;
 		pRole->m_eSex = m_eSex;
 		pRole->m_nAge = m_nAge;
 		pRole->m_strName = m_strName;
 		pRole->m_nDscriptLength = m_nDscriptLength;
 		pRole->m_pDescription = new char[m_nDscriptLength + 1];
 		memset(pRole->m_pDescription, 0, m_nDscriptLength + 1);
 		memcpy(pRole->m_pDescription, m_pDescription, m_nDscriptLength);
 		return pRole;
 	}	
 
 protected:
 private:
 };
 
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 
 	//创建描述语句
 	char *pChar = "So clever!";
 	int nLength = strlen(pChar);
 
 	char *pChar_1 = "A Nice People!";
 	int nLength_1 = strlen(pChar_1);
 	
 	//创建BaseRole
 	BaseRole *pBase = new BaseRole;
 	pBase->Setproperty(male, 15);
 	pBase->SetDescription(pChar, nLength);
 	pBase->SetName("BaseRole");
 
 	//根据BaseRole创建其他
 	BaseRole *pTom = (BaseRole*)pBase->Clone();
 	pTom->SetDescription(pChar_1, nLength_1);
 	pTom->SetName("Tom");
 
 	BaseRole *pLucy = dynamic_cast<BaseRole*>(pBase->Clone());
 	pLucy->Setproperty(famale, 18);
 	pLucy->SetName("Lucy");
 
 	pBase->Show();
 	pTom->Show();
 	pLucy->Show();
 
 	DELETE_OBJECT(pBase);
 	DELETE_OBJECT(pTom);
 	DELETE_OBJECT(pLucy);
 
 	return 0;
 }
 
 /*结果
 Now Show A Role Information:
 Name:BaseRole
 Sex: Male
 Age :15
 	 So clever!
 
 
 	 Now Show A Role Information:
 Name:Tom
 Sex: Male
 Age :15
 	 A Nice People!
 
 
 	 Now Show A Role Information:
 Name:Lucy
 Sex: FeMale
 Age :18
 	 So clever!
 	 请按任意键继续. . .
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值