(十)原型模式

1. 定义

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。[DP]

提供ICloneable接口,其中唯一的方法Clone(),只要实现这个接口就可以完成原型模式。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
简单点说就是,实现了一个clone的接口,来从一个对象创建另一个可定制对象。

2. 实例

#include <iostream>
#include <string>
using namespace std;

class Prototype
{
public:
    Prototype() = default;
    void SetState(string state){ m_state = state; }
    string GetState(){ return m_state; }
    virtual void show(){
        cout << "state is " << m_state << endl;
    }
    virtual Prototype* Clone() = 0;
private:
    string m_state;
};

class PrototypeA :public Prototype
{
public:
    PrototypeA() = default;

    void show(){
        Prototype::show();
        cout << endl;
    }
    Prototype* Clone(){
        Prototype* p = new PrototypeA();
        p->SetState(this->GetState());
        return p;
    }
};

int main()
{
    Prototype* a = new PrototypeA();
    a->SetState("off");
    a->show();

    Prototype* b = a->Clone();
    b->show();
    b->SetState("on");
    b->show();

    delete a;
    delete b;

    return 0;
}

3. 浅复制和深复制的区别

  • 浅复制,被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象;
  • 深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象;

4. 实践

在实际项目中,有许多struct或者class有拷贝、复制、克隆的需求,原型模式提供了一种思路。
另外还有 std::copy 函数.

原文地址:https://www.cnblogs.com/walkinginthesun/p/9521820.html