[设计模式]创造模式之原型模式

意图:通过拷贝一个现有对象生成新对象

关键代码: 实现一个clone接口,完成对象的快速拷贝

优点: 1、性能提高

缺点: 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

    

使用场景: 1、资源优化场景。

                  2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

                  3、性能和安全要求的场景。

                  4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

                  5、一个对象多个修改者的场景。

                  6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的

场景:

在我们群发消息的时候,我们期望发送的消息都是相同的内容,而姓名,性别根据实际情况进行发送,这种情况下,我们可以使用原型模式: 

enum Sex{
	man = 0,
	woman
};

class Mail{
private:
	std::string _name;
	bool _sex;
	std::string _title;
	std::string _context;
	std::string _tail;
	Mail(Mail& m)
	{
		std::cout << "Mail copy" << std::endl;
		this->_title = m._title;
		_context = m._context;
		_tail = m._tail;
	}
public:
	Mail()
	{}
	void settitle(string& title)
	{
		_title = title;
	}
	void setcontext(string& context)
	{
		_context = context;
	}
	void settail(string& tail)
	{
		_tail = tail;
	}
	void setname(string name)
	{
		_name = name;
	}
	void setsex(Sex sex)
	{
		_sex = sex;
	}
	void send()
	{
		std::cout << _title <<"  "<< _name ;
		if (_sex== man)
		{
			std::cout << "先生";
		}
		else
		{
			std::cout << "女士";
		}
		std::cout << " : " << _context << "   " << _tail << std::endl;;
	}
	
	Mail* clone()
	{
		return new Mail(*this);
	}

};

测试: 

map<string, Sex>  client = { { "张三", man }, { "李四", man }, { "李红", woman } };

void Test()
{
    Mail m;
    /*string title, context, tail;
    std::cout << "请输入标题:";
    std::cin >> title;
    std::cout << "请输入信息:";
    std::cin >> context;
    std::cout << "请输入补充信息";
    std::cin >> tail;*/
    string title = "xx银行优惠活动";
    string context = "您可以获取50元优惠券";
    string tail = "最终解释权归xx银行所有";
    m.settitle(title);
    m.setcontext(context);
    m.settail(tail);

    map<string, Sex>::iterator it = client.begin();
    while (it != client.end())
    {
        Mail* mm = m.clone();
        mm->setname(it->first);
        mm->setsex(it->second);

        mm->send();
        ++it;
    }
}

注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值