原型模式C++

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

原型模式结构图

原型模式C++_第1张图片
image

原型模式基本代码

原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节。

#include 
#include 
#include "string.h"
using namespace std;

class Prototype { // 原型类
private:
    string id;
    char* str;
public:
    virtual ~Prototype() {
        delete[] str;
    }
    virtual Prototype* Clone() = 0;
    Prototype(string i, char* s) { 
        id = I; 
        int len = strlen(s);
        str = new char[len+1];  // 深度复制
        cout << &str << endl;   // 输出str的地址,作为对比
        strcpy(str, s);
        str[len] = '\0';
    }
    string GetId() { return id; }
    char* GetStr() { return str; }
};

class ConcretePrototype1 : public Prototype {
public:
    ConcretePrototype1(string id, char* s) : Prototype(id, s) {}
    ConcretePrototype1(ConcretePrototype1& cp1) : Prototype(cp1.GetId(), cp1.GetStr()){} // 复制构造函数,实现深度复制
    Prototype* Clone() {
        return new ConcretePrototype1(*this);
    }
};

class ConcretePrototype2 : public Prototype {
public:
    ConcretePrototype2(string id, char* s) : Prototype(id, s) {}
    ConcretePrototype2(ConcretePrototype2& cp2) : Prototype(cp2.GetId(), cp2.GetStr()){} // 复制构造函数,实现深度复制
    ConcretePrototype2* Clone() {
        return new ConcretePrototype2(*this);
    }
};

int main() {
    char* s = "Hello";
    Prototype* p = new ConcretePrototype1("1", s); // 0x7f99ad501060
    Prototype* c = p->Clone();   // 0x7f99ad501090
    cout << c->GetId() << endl;  // 1
    cout << c->GetStr() << endl; // Hello

    delete p;
    delete c;

    return 0;
}

你可能感兴趣的:(原型模式C++)