意图:通过拷贝一个现有对象生成新对象
关键代码: 实现一个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;
}
}
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!