C++ (5) 深入理解原型模式

本文是设计模式的第五篇-原型模式(Prototype Pattern)。原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的讲就是当需要创建一个新的实例化对象时,我们刚好有一个实例化对象,但是已经存在的实例化对象又不能直接使用。这种情况下拷贝一个现有的实例化对象来用,可能会更方便。本文会深度解析原型模式的实际应用场景和优点。

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的讲就是当需要创建一个新的实例化对象时,我们刚好有一个实例化对象,但是已经存在的实例化对象又不能直接使用。这种情况下拷贝一个现有的实例化对象来用,可能会更方便。

本文作者原创,未经允许请勿转载,本帖原创请勿照抄。

C++深入理解原型模式目录

一、原型模式

1. 示例

二、使用场景

三、个人理解


一、原型模式

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

 

 

猜你喜欢

转载自blog.csdn.net/qq_37529913/article/details/113499526