• (十)原型模式


    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 函数.

  • 相关阅读:
    项目管理原则
    开发规范
    讲故事-如何才算确认了需求
    关于概要设计
    jQuery操作
    IE8,IE9,IE10绿色版,以及ColorPix
    机务UI设计小节
    Abstract Factory
    Flyweight
    Chain of Responsibility
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/9521820.html
Copyright © 2020-2023  润新知