首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

什么时候用Prototype形式

2013-01-02 
什么时候用Prototype模式?当然是为了clone一个对象而存在的,但我看过阎宏的那本书,到了也没讲明白啥需要这

什么时候用Prototype模式?
当然是为了clone一个对象而存在的,但我看过阎宏的那本书,到了也没讲明白啥需要这么用。btw,阎宏那本书写得真差,例子举得了很逊。
[解决办法]
http://www.cnblogs.com/hjqxaly/archive/2010/09/09/1822460.html
[解决办法]
这里有个例子,你可以参考: http://www.codeproject.com/Articles/185348/Prototype-Design-Pattern

顺便简单的说一下:
Prototype通常用来解决一个问题:对象的创建比较耗费资源。比如,对象创建的时候需要访问数据库、需要读取外部文件、需要使用网络,这些都是比较耗费时间和内存的。如果可以用clone来解决,就方便多了。

举一个比较直观的例子:星际争霸的人物的初始化,就说机枪兵吧,游戏在初始化的时候,要从硬盘读取很多资料,比如机枪兵的UI资源(图片什么的),机枪兵的AI,等其他的参数,由于涉及到了磁盘IO操作,当然会很慢。

如果玩家在游戏中造了100个机枪兵,难不成有100次磁盘读取动作?当然不能这么做,我们只要读取一个,然后把它放入一个Prototype Manager里面,以后只要从这里取一个’模板‘,然后clone一下就可以了,每次新的机枪兵只有个别参数不一样,比如位置等,由于clone是基于内存的操作,速度是非常的快。

当然Prototype还可以解决其他的对象创建的问题,比如:client不了解对象的创建过程,或者client只有对象的多态的指针,根本不知道这个指针指的是哪个具体的子类。对于前者,通常对象的创建是封装在其他lib/class中,client端无法直接创建对象。对于后者,看下面的例子:


    Image* ba[] = {new Bitmap("abc"), new OtherPicFormat("cde", 0)};
    vector<Image*> vb;
    copy(ba, ba + sizeof(ba) / sizeof(Image*), back_inserter(vb));

    Image* pb = NULL;
    for (vector<Image*>::iterator it = vb.begin(); it != vb.end(); ++it)
    {
        pb = (*it)->clone(); // clone will create a new object
        pb->reform();
        delete pb;
        delete *it;
    }

client code可能只能拿到对象的父类的指针,比如上面的迭代过程,我们只能看到Image指针,它根本不知道它要复制的是Bitmap还是OtherPicFormat,用clone()方法就解决这个问题了。


[解决办法]
有一个类,类中有许多成员变量,这些成员变量设置成不同的值的时候对象会有不同的行为;
这些成员变量的值存在多种组合,但是,最常用的有几种;
为了不需要在每次创建对象的时候都set,set,set,set,...,为这些常见的设置组合各生成一个Prototype对象,需要创建一个某种配置的对象时,就从对应的Prototype对象Copy一个就好了。

[解决办法]
举出我实际开发中一个例子:
GUI中,不同的界面控件需要一个Style来指定样式(字体,字体颜色,前景,背景颜色,位图字体等等),很多时候,你只需要在系统默认的或者已有的Style基础上修改一个,比如字体,那么如果从头来初始化一个Style是没有必要的.这时候,prototype就有了用武之地,那就是Style类支持clone,这样只需要在已有Style基础上clone一个,再修改需要需求属性就可以了.简单快速.理解没?

热点排行