首页 > 代码库 > 原型模式

原型模式

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

 

实用性:1.当要实例化的类是在运行时刻指定时。

    2.为了避免创建一个与产品类层次平行的工厂类层次时。

    3.当一个类的实例只能有几个不同状态组合中的一种时。

 

效果:   1.可以在运行时刻增加产品。

    2.改变值以指定新对象。

    3.改变结构以指定新对象。

    4.减少子类的构造。

    5.用类动态配置应用。

 

结构:

原型模式让我们不用重新初始化对象,而是动态地获得对象运行时的状态,并且在不确定对象类型的时候能

创建出对应新对象。

 

代码实例:

#ifndef _GOODS_#define _GOODS_#include <string>#include <iostream>using namespace std;class AbsGoods{public:    virtual AbsGoods* Clone() = 0;    virtual void PrintfInfo(){cout<<*_mpMaster<<"‘s "<<_mName<<endl; }protected:        AbsGoods(const AbsGoods& another){}    ~AbsGoods(){delete _mpMaster; }    AbsGoods(){}    string _mName;    string* _mpMaster;};class Mp3:public AbsGoods{public:    Mp3(string Master){_mName = "Mp3";_mpMaster = new string;*_mpMaster = Master;}    Mp3(const Mp3& another)    {        _mName = another._mName;        _mpMaster = new string;        *_mpMaster = *(another._mpMaster);    }    ~Mp3(){delete _mpMaster;}    virtual AbsGoods* Clone()    {        return new Mp3(*this);    }};class Computer:public AbsGoods{public:    Computer(string Master){_mName = "Computer";_mpMaster = new string;*_mpMaster = Master;}    Computer(const Computer& another)    {        _mName = another._mName;        _mpMaster = new string;        *_mpMaster = *(another._mpMaster);    }    ~Computer(){delete _mpMaster;}    virtual AbsGoods* Clone()    {        return new Computer(*this);    }};#endif

 

 

现在假设Merry的爸爸买了一台电脑

AbsGoods* pGoods1 = new Computer("Merry‘dad");

 

然后Merry的爸爸把电脑送给她

pGoods1->SetMaster("Merry");

 

然后Mical也想要一台和Merry一样的电脑。但是因为只知道pGoods1 ,不能确定其类型。

无法AbsGoods* pGoods2 = new Computer("Mical");

 

Prototype 让我们可以不确定对象类型的时候能创建出对应新对象

AbsGoods* pGoods2 = pGoods1->Clone();
pGoods2->SetMaster("Mical");

 

假设电脑还要配置很多特性,如Memory,CPU等。Prototype让我们不用重新初始化对象

pGoods1 对应物品的各种属性都被拷贝到 pGoods2 了。

 

#include <iostream>using namespace std;#include "Prototype.h"int main(){    AbsGoods* pGoods1 = new Computer("Merry");    pGoods1->PrintfInfo();    AbsGoods* pGoods2 = pGoods1->Clone();    pGoods2->SetMaster("Mical");    pGoods2->PrintfInfo();return 0;}

 --------新手初学,望大神指点--------

原型模式