//
// Created by win10 on 2021/11/16.
//
#include <thread>
#include <iostream>
using namespace std;
// 原型模式
class Prototype {
public:
    Prototype(): m_string("") {}
    Prototype(string str): m_string(str) {}
    virtual ~Prototype() = default;
    void show() {
        std::cout << "show: " << this->m_string << std::endl;
    }
    virtual Prototype* clone() = 0;
private:
    string m_string;
};
class ConcretePrototype1: public Prototype {
public:
    ConcretePrototype1() {};
    ConcretePrototype1(string str): Prototype(str) {};
    virtual Prototype* clone() {
        ConcretePrototype1* newObj = new ConcretePrototype1();
        *newObj = *this;
        return newObj;
    }
};
class ConcretePrototype2: public Prototype {
public:
    ConcretePrototype2() {};
    ConcretePrototype2(string str):Prototype(str) {};
    virtual Prototype* clone() {
        ConcretePrototype2* newObj = new ConcretePrototype2();
        *newObj = *this;
        return newObj;
    }
};
int main() {
    ConcretePrototype1* test = new ConcretePrototype1("tqz");
    ConcretePrototype2* test2 = dynamic_cast<ConcretePrototype2 *>(test->clone());
    test->show();
    test2->show();
    delete test;
    delete test2;
    return 0;
}