Linux C++ 050-设计模式之原型模式

发布于:2024-07-11 ⋅ 阅读:(30) ⋅ 点赞:(0)

Linux C++ 050-设计模式之原型模式

本节关键字:Linux、C++、设计模式、原型模式
相关库函数:

概念

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

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

使用场景

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

代码示例

class Clone
{
public:
    virtual Clone* clone() = 0;
    virtual void show() = 0;
};
// 具体实现类
class Sheep : public Clone
{
public:
    Sheep(int id, string name) :Clone(), // 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()
{
    Clone* s1 = new Sheep(1, "abs");
    s1->show();
    Clone* s2 = s1->clone();
    s2->show();

    delete s1;
    s1 = NULL;
    delete s2;
    s2 = NULL;
    return 0;
}
// 注意:克隆函数,返回的是基类的指针
/*
运行结果:
Sheep() id address:0x5f1518
Sheep() name address : 0x5f1520
id : 1
name : abs
Sheep(const Sheep & obj) id address : 0x5f19e8
Sheep(const Sheep & obj) name address : 0x5f19f0
id : 1
name : abs
*/