prototype 设计模式

概要 : 使用一个原型实例来指定要创建的对象, 通过拷贝原型来创建一个新的实例

应用 : 当一个系统独立于对象的创建,构造过程,和表示的时候

              1.当要实例化的类是在运行时指定的

              2.避免创建一个平行于产品类层次的工厂类层次

              3.当一个类的实例只有不同状态组合中一小部分, 通常安装特定数量的原型,通过拷贝而不是类的实例化通常较为方便

代码:

 

#include<iostream>
#include<vector>
using namespace std;

class Clonable
{
public:
    virtual Clonable* clone() = 0;

    virtual ~Clonable() {}

};


class Float : public Clonable
{
public:
    Float(float v) : _value(v)
    {

    }

    float getValue()
    {
        return _value;
    }

    Float* clone()
    {
        Float* pRet = new Float(_value);
        return pRet;
    }

    ~Float()
    {

    }

private:
    float _value;
};


class Double : public Clonable
{
public:
    Double(float v) : _value(v)
    {

    }

    double getValue()
    {
        return _value;
    }

    Double* clone()
    {
        Double* pRet = new Double(_value);
        return pRet;
    }

    ~Double()
    {

    }

private:
    double _value;
};

class Array : public Clonable
{
public:

virtual Array* clone()
{
    Array* ret = new Array();

    vector<Clonable*>::iterator it = data.begin();

    for(; it != data.end(); ++it)
    {
        Clonable* cloneObj = (*it)->clone();
        ret->addObject(cloneObj);
    }

    return ret;
}

void addObject(Clonable* object)
{
    data.push_back(object);
}

~Array()
{
    vector<Clonable*>::iterator it = data.begin();

    for(; it != data.end(); ++it)
    {
        Clonable* cloneObj = (*it)->clone();
        delete cloneObj;
    }

}

private:

vector<Clonable*> data;
};

int main(int argc, char** argv)
{

    Float f1(1.0f);
    Float f2(2.0f);

    Double d1(3.0);
    Double d2(4.0);

    Array array1;
    array1.addObject(&f1);
    array1.addObject(&f2);
    array1.addObject(&d1);
    array1.addObject(&d2);

    Array* array2 = array1.clone();

    if(array2 != &array1)
    {
        cout << "copy successfully" << endl;
    }
    else
    {
        cout << "not success" << endl;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值