码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-30 22:23:44      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

原型(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原型。

 

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

标签:

原文地址:http://www.cnblogs.com/wuweixin/p/5449499.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!