• 设计模式学习总结:(8)原型模式


    原型(prototype)模式和工厂方法模式很像,也是为了在对象创建的时候更加灵活。但是,不同的地方是,原型模式是工厂和相应类对象的结合体,通过在类中定义一个clone方法用来克隆自己,这样的类也被称为原型。对比工厂方法,可以想到有这样的好处,省略了工厂类的定义实现,简化了创建实例的过程,因为只要复制构造就行了。当然,缺点也是有的,把clone的职责给了原型类,实际上也是增加了类的职责,

    意图:

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

    通过已有对象来创建新的对象是它的特点

    结构图:

    改写工厂方法模式:

    class AbProduct
    {
    public:
        virtual void sayName()=0;
        AbProduct(string name) :_name(name){}
        virtual ~AbProduct(){}
        virtual AbProduct *clone()=0;
    protected:
        string _name;
    };
    
    class DBProduct:public AbProduct
    {
    public:
        DBProduct(string name) :AbProduct(name){}
        DBProduct(const DBProduct &product) :AbProduct(product._name){}
        ~DBProduct(){}
        void sayName();
        virtual AbProduct *clone();
    private:
         
    };
    AbProduct * DBProduct::clone()
    {
        return new DBProduct(*this);
    }
    
    void DBProduct::sayName()
    {
        cout << _name << endl;
    }
    class TextProduct:public AbProduct
    {
    public:
        TextProduct(string name) :AbProduct(name){}
        TextProduct(const TextProduct &product) :AbProduct(product._name){}
        ~TextProduct(){}
        void sayName();
        virtual AbProduct *clone();
    private:
    
    };
    AbProduct * TextProduct::clone()
    {
        return new TextProduct(*this);
    }
    void TextProduct::sayName()
    {
        cout << _name << endl;
    }

    具体的用处:

    class BigClient
    {
        AbProduct *_prototype;
    public:
        BigClient(AbProduct * prototype) :_prototype(prototype){}
        ~BigClient(){ delete _prototype; }
        void operation()
        {
            AbProduct *p = _prototype->clone();
            p->sayName();
            delete p;
        }
    };

    结果:

    在BigClient中,第一次创建传入的对象将作为以后的clone原型。

  • 相关阅读:
    jQuery+d3绘制流程图OK
    jQuery+d3绘制流程图OK
    史上最全的后端技术大全,你都了解哪些技术呢?
    史上最全的后端技术大全,你都了解哪些技术呢?
    R语言面板数据分析步骤及流程
    R语言面板数据分析步骤及流程
    SQL Server之深入理解STUFF
    1048:有一门课不及格的学生
    1048:有一门课不及格的学生
    1047:判断能否被3,5,7整除
  • 原文地址:https://www.cnblogs.com/wuweixin/p/5449499.html
Copyright © 2020-2023  润新知