zoukankan      html  css  js  c++  java
  • 原型模式(Prototype)

    原型模式(Prototype

     

    原型模式(Prototype

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

    应用Java/C#中的ClonableIClonable接口等。

    模式结构

     

    心得

    原型模式本质上就是对象的拷贝,使用对象拷贝代替对象创建的原因有很多。比如对象的初始化构造非常复杂,消耗资源巨大;运行时对象状态变化不可重现;无法获得对象的成员的运行时值等。实现原型模式关键在于对象的正确复制,因此像高级语言实现的那样——支持复制接口。而对象的复制分为“深复制”和“浅复制”,前者除了复制对象本身数据外,还需要复制对象内指针引用的数据,后者则是仅仅复制对象数据。另外,深度复制如果遇到循环引用的对象就会产生问题。

    举例

    按照上述设计,这里实现模式的代码如下:

     
    //基本原型接口——相当于Clonable
    class Prototype
    {
    public:
        virtual Prototype* Clone()=0;
        virtual ~Prototype(){}
    };
    //原型管理器
    class PrototypeMgr
    {
        hash_map<char*,Prototype*>map;
    public:
        void regProto(char* key,Prototype*p)
        {
            if(map.find(key)!=map.end())
            {
                delete map[key];
            }
            map[key]=p;
        }
        Prototype* const operator[](char* key)
        {
            if(map.find(key)!=map.end())
            {
                return map[key]->Clone();
            }
            else
                return NULL;
        }
        ~PrototypeMgr()
        {
            for(hash_map<char*,Prototype*>::iterator it=map.begin();
                it!=map.end();++it)
            {
                delete it->second;
            }
        }
    };
    //浅拷贝
    class ConcretePrototype1:public Prototype
    {
        int * refMember;
        int member;
    public:
        virtual Prototype* Clone()
        {
            cout<<"执行ConcretePrototype1的浅复制"<<endl;
            ConcretePrototype1*copy= new ConcretePrototype1;
            copy->member=member;
            copy->refMember=refMember;
            return copy;
        }
    };
    //深度拷贝
    class ConcretePrototype2:public Prototype
    {
        int * refMember;
        int member;
    public:
        ConcretePrototype2():refMember(new int){}
        virtual Prototype* Clone()
        {
            cout<<"执行ConcretePrototype2的深复制"<<endl;
            ConcretePrototype2*copy= new ConcretePrototype2;
            copy->member=member;
            copy->refMember=new int;//指针引用数据也要拷贝
            *copy->refMember=*refMember;
            return copy;
        }
        virtual~ConcretePrototype2()
        {
            delete refMember;
        }
    };
     

    这里添加一个原型管理器,用来管理所有的注册的原型。用户需要拷贝出原型只需要从这里请求即可。

     
    PrototypeMgr mgr;
    //注册原型
    mgr.regProto("浅复制",new ConcretePrototype1);
    mgr.regProto("深复制",new ConcretePrototype2);
    //请求原型
    Prototype*cp1=mgr["浅复制"];
    Prototype*cp2=mgr["深复制"];
    delete cp1;
    delete cp2;
     

    来源:http://www.cnblogs.com/fanzhidongyzby/archive/2012/12/14/2818816.html

  • 相关阅读:
    STL 全排列
    Happy Programming Contest
    输入外挂
    Crazy Professor
    订票助手 12306
    我的e证空间 出入境证照可在家自拍啦!
    雨生红球藻 虾青素 寻找正规产品!
    CAR 汽车团购网站—广州
    3G路由器、无线接入点(无线AP)、无线路由器!
    微软 Lightswitch 发布 V2 Beta,引入新的逻辑层基础技术!
  • 原文地址:https://www.cnblogs.com/94julia/p/3092245.html
Copyright © 2011-2022 走看看