本文是设计模式的第五篇-原型模式(Prototype Pattern)。原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的讲就是当需要创建一个新的实例化对象时,我们刚好有一个实例化对象,但是已经存在的实例化对象又不能直接使用。这种情况下拷贝一个现有的实例化对象来用,可能会更方便。本文会深度解析原型模式的实际应用场景和优点。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的讲就是当需要创建一个新的实例化对象时,我们刚好有一个实例化对象,但是已经存在的实例化对象又不能直接使用。这种情况下拷贝一个现有的实例化对象来用,可能会更方便。
本文作者原创,未经允许请勿转载,本帖原创请勿照抄。
C++深入理解原型模式目录
一、原型模式
1. 示例
/*
* 关键代码:拷贝,return new className(*this);
*/
#include <iostream>
using namespace std;
//提供一个抽象克隆基类。
class Clone
{
public:
virtual Clone* clone() = 0;
virtual void show() = 0;
};
//具体的实现类
class Sheep:public Clone
{
public:
Sheep(int id, string name):Clone(),
m_id(id),m_name(name)
{
cout << "Sheep() id address:" << &m_id << endl;
cout << "Sheep() name address:" << &m_name << endl;
}
~Sheep()
{
}
//关键代码拷贝构造函数
Sheep(const Sheep& obj)
{
this->m_id = obj.m_id;
this->m_name = obj.m_name;
cout << "Sheep(const Sheep& obj) id address:" << &m_id << endl;
cout << "Sheep(const Sheep& obj) name address:" << &m_name << endl;
}
//关键代码克隆函数,返回return new Sheep(*this)
Clone* clone()
{
return new Sheep(*this);
}
void show()
{
cout << "id :" << m_id << endl;
cout << "name:" << m_name.data() << endl;
}
private:
int m_id;
string m_name;
};
int main()
{
Clone* s1 = new Sheep(1, "abs");
s1->show();
Clone* s2 = s1->clone();
s2->show();
delete s1;
s1 = nullptr;
delete s2;
s2 = nullptr;
return 0;
}
运行结果:
二、使用场景
1. 当new一个对象,非常繁琐复杂时,可以使用原型模式来进行复制一个对象。比如创建对象时,构造函数的参数很多,而自己又不完全的知道每个参数的意义,就可以使用原型模式来创建一个新的对象,不必去理会创建的过程。
2. 当需要new一个新的对象,这个对象和现有的对象区别不大,我们就可以直接复制一个已有的对象,然后稍加修改。
3. 当需要一个对象副本时,比如需要提供对象的数据,同时又需要避免外部对数据对象进行修改,那就拷贝一个对象副本供外部使用。
三、个人理解
原型模式最主要的功能就是实现深拷贝,在原有流程中都会涉及到类代码的变动。比如:上面示例的代码部分在实现原型模式都会涉及到原有代码的改变,那么:请看下图
上图这个说明是两种代码,实现的都是一样的功能都实现了深拷贝(深拷贝、浅拷贝请参考我的另一篇文章:https://blog.csdn.net/qq_37529913/article/details/110235596),一样的变量值拷贝和地址不是同一个地址。所以说设计模式只是一种规范和思想,它有值得参考地方。但是日常工作中和写代码中还得看具体要求或者个人习惯。
本篇参考借鉴博客:
https://blog.csdn.net/wuzhekai1985/article/details/6667020
https://www.cnblogs.com/chengjundu/p/8473564.html