C++创建型模式——原型模式 结合具体实例


前言

写这一系列之前,我也是在开发中越来越重视开发模式,同时也是整理了一番。各种开发模式多而杂,乱而又相似,写这些东西也是为了记录和巩固,要是有不同见解欢迎随时指正。

为什么我们要在软件开发中使用设计模式,我认为以下三点总结的是很到位的:

  1. 为了代码可重用性、增加可维护性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化。

  2. 设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。

  3. 能够使我们的代码更加结构化,清晰明了

|版本声明:山河君,未经博主允许,禁止转载

一、原型模式是什么?

原型模式(Prototype Pattern)是是属于创建型模式的一种。是为了隐藏创建逻辑而创建对象的一种方法。

原型主要用于创建重复的对象,说白了就是将自己重新进行拷贝一下,然后再给出去,多数用于一个对象多次修改的情景。这种模式比较容易理解,虽然方便了使用,但其实在构思的时候也具有很多不得不考虑的地方,所以在使用的时候要考虑清楚适不适合该场景:

  • 需要考虑到深拷贝
  • 需要添加一个clone的方法
  • 需要有实现拷贝的接口(实际代码中,多数需要拷贝的成员都是私有)

二、具体实例

让我们来思考一个场景:现在需要打印三份邮件,邮件的格式有主题、内容、收件人,然而收件人都是不一样的。

一般的做法就是创建三份邮件对象,然后一一填写主题、内容、收件人,然而这太繁琐了,我们使用原型模式的思想进行简化。

先有场景,我们要发送两封邮件,分别给Ali和Aaron,内容和标题都是一致的,只有收件人不一致,我们可以先构建一个邮件类,在邮件类中加上copy自己的方法。

值得注意的是,要非常小心类成员的拷贝,特别是动态申请内存的时候

#include <iostream>

class Email {
public:
	void SetTiTle(const char* chTitle, size_t stLen);	//设置标题
	void SetContext(const char* chContext, size_t stLen);	//设置内容
	void SetRecvPeople(const char* chName, size_t stLen);	//设置接收人
	void Copy(Email* pEmail);		//原型模式——用于复制
	void Send();		//发送

private:
	//要非常小心类成员变量内存操作
	char chTitle[512];
	char chContext[1024];
	char chName[128];
};

void Email::SetTiTle(const char* chTitle, size_t stLen)
{
	memset(this->chTitle, 0, 512);
	if (stLen < 512)
	{
		memcpy(this->chTitle, chTitle, stLen);
	}
}

void Email::SetContext(const char* chContext, size_t stLen)
{
	memset(this->chContext, 0, 1024);
	if (stLen < 1024)
	{
		memcpy(this->chContext, chContext, stLen);
	}
}

void Email::SetRecvPeople(const char* chName, size_t stLen)
{
	memset(this->chName, 0, 128);
	if (stLen < 128)
	{
		memcpy(this->chName, chName, stLen);
	}
}

void Email::Copy(Email* pEmail)
{
	memcpy(this->chTitle, pEmail->chTitle, 512);
	memcpy(this->chContext, pEmail->chContext, 1024);
	memcpy(this->chName, pEmail->chName, 128);
}

void Email::Send()
{
	std::cout << "Title:" << chTitle << std::endl;
	std::cout << "Context:" << chContext << std::endl;
	std::cout << "Name:" << chName << std::endl;
}

int main()
{
	Email* pEmailToAli = new Email;
	Email* pEmailToAaron = new Email;

	{
		char chTitle[] = "hello";
		char chContext[] = "I miss you";
		char chName[] = "Ali";
		pEmailToAli->SetTiTle(chTitle, strlen(chTitle));
		pEmailToAli->SetContext(chContext, strlen(chContext));
		pEmailToAli->SetRecvPeople(chName, strlen(chName));
		pEmailToAli->Send();
	}
	
	{
		char chName[] = "Aaron";
		pEmailToAaron->Copy(pEmailToAli);
		pEmailToAaron->SetRecvPeople(chName, strlen(chName));
		pEmailToAaron->Send();
	}
	return 0;
}

总结

原型模式比较简单,写法也各种各样,但总的来说,一般只要注意内存的拷贝就不会有太大 的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值