美文网首页
原型模式C++

原型模式C++

作者: 涵仔睡觉 | 来源:发表于2018-05-15 15:17 被阅读0次

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

    原型模式结构图

    image

    原型模式基本代码

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

    #include <iostream>
    #include <string>
    #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++

          本文链接:https://www.haomeiwen.com/subject/ortydftx.html