码迷,mamicode.com
首页 > 编程语言 > 详细

10、[C++]原型模式

时间:2015-02-14 23:48:49      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

解决的问题:

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

 

这个其实和C++的拷贝构造函数的作用是一致的, 实际上就是动态抽取当前对象运行时的状态(好吧, 其实我还没弄懂两者的区别, 请大牛赐教).

 

C++的拷贝构造函数分为浅拷贝和深拷贝.

浅拷贝:就是给对象中的每个成员变量进行复制, 就是把A1类中的变量直接赋给A2类中变量, 属于值传递, 但是涉及到有指针类型的成为, 它们指向的是同一块内存. 这就出现了问题:当B把内存释放了(如:析构), 这时A内的指针就是野指针了, 出现运行错误.

深拷贝:就是不仅使用值传递, 而是要每个变量都有自己一份独立的内存空间, 互不干扰.

 

原型模式 UML 类图:

技术分享

 

以下代码摘自: 《C++设计模式——原型模式》

/*
** FileName     : PrototypePatternDemo
** Author       : Jelly Young
** Date         : 2013/11/25
** Description  : More information, please go to http://www.jellythink.com
*/

#include <iostream>
using namespace std;

//接口
class Prototype
{
public :
    Prototype(){}
    virtual ~Prototype(){}

    virtual Prototype * Clone() = 0;
};

//实现
class ConcretePrototype : public Prototype
{
public :
    ConcretePrototype():m_counter(0){}
    virtual ~ConcretePrototype(){}

    //拷贝构造函数
    ConcretePrototype( const ConcretePrototype & rhs)
    {
        m_counter = rhs .m_counter;
    }

    //复制自身
    virtual ConcretePrototype * Clone()
    {
        //调用拷贝构造函数
        return new ConcretePrototype (*this );
    }

private :
    int m_counter;
};

int main(int argc , char **argv)
{
    //生成对像
    ConcretePrototype * conProA = new ConcretePrototype ();

    //复制自身
    ConcretePrototype * conProB = conProA->Clone();

    delete conProA;
    conProA= NULL ;

    delete conProB;
    conProB= NULL ;

    return 0;
}

 

常用场景

基本就是需要从A的实例得到一份与A内容相同, 但是又互不干扰的实例的话, 就需要使用原型模式.

举例说明(可能是错的..):

我们玩游戏打副本时, 有的游戏会这么设计, 在进副本前保存当前的人物状态, 然后打完副本后恢复前进副本前的状态, 此时是不是就可以应用原型模式? 进副本前复制一个当前角色的实例, 然后进副本后用复制出来的新实例来维护角色, 退出副本时又使用旧的实例...

10、[C++]原型模式

标签:

原文地址:http://www.cnblogs.com/hanxiao-martin/p/4292301.html

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