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

原型模式

时间:2014-12-18 14:44:36      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   sp   on   div   

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

 

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

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

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

 

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

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

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

    4.减少子类的构造。

    5.用类动态配置应用。

 

结构:

bubuko.com,布布扣

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

创建出对应新对象。

 

代码实例:

#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;
}

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

原型模式

标签:style   blog   http   io   color   os   sp   on   div   

原文地址:http://www.cnblogs.com/wrbxdj/p/4171483.html

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