C++ 原型模式

简介

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式和拷贝构造的区别

原型模式类是未知的,拷贝构造类是已知的:意思是原型函数可以使用多态,所以类是未知的,也可能创建的是子类的对象;而拷贝构造就是他自己了。
所以拷贝构造就是原型模式的一个子集

而且还有个要注意的是,完全拷贝一个对象,肯定要用深拷贝

使用场景

基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。

优点

.使用原型模式比直接new一个对象的开销要小的多。
因为new一个对象可能需要一些复杂的逻辑,导致开销比较大,而原型模式只需要进行拷贝就行了开销相对要小的多了。

代码如下(c++11):

#include <iostream>
#include <string>
#include <string.h>
#include <memory>

class prototype_base
{
public:
	prototype_base(void){}
	virtual ~prototype_base(void){}
	virtual void print_reslut(void) = 0;
	virtual std::shared_ptr<prototype_base> clone(void) = 0;
};

class concrete_prototype : public prototype_base
{
public:
	concrete_prototype(const char *name)
	{ 
		if(name)
		{
			init_name(name);
		}
		else
		{
			init_name("concrete_prototype");
		}
	}
	~concrete_prototype(void)
	{
		clear();
	}
	concrete_prototype(const concrete_prototype& cp)
	{
		if(cp.m_name==nullptr || cp.m_len == 0)
		{
			init_name("concrete_prototype");
		}
		else
		{
			init_name(cp.m_name);
		}
	}
	std::shared_ptr<prototype_base> clone(void)
	{
		return std::make_shared<concrete_prototype>(*this);
		//return new concrete_prototype(*this);
	}
	void print_reslut(void)
	{
		std::cout << "my prototype name is : " << m_name << std::endl;
	}
	void init_name(const char *name)
	{
		clear();
		m_len = strlen(name) + 1;
		m_name = (char *)malloc(m_len);
		snprintf(m_name, m_len, "%s", name);
	}
	void clear(void)
	{
		if(m_name)
		{
			free(m_name);
			m_name = nullptr;
			m_len = 0;
		}
	}
	
	char *m_name;
	int m_len;
};

int main()
{
	std::cout << "start-up .." << std::endl;
	
	std::shared_ptr<prototype_base> proa = std::make_shared<concrete_prototype>("删库解bug");
	proa->print_reslut();
	std::shared_ptr<prototype_base> prob = proa->clone();
	prob->print_reslut();

	std::cout << "done .." << std::endl;
    return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值