当然是为了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端无法直接创建对象。对于后者,看下面的例子:
- C/C++ code
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; }
------解决方案--------------------
有一个类,类中有许多成员变量,这些成员变量设置成不同的值的时候对象会有不同的行为;
这些成员变量的值存在多种组合,但是,最常用的有几种;
为了不需要在每次创建对象的时候都set,set,set,set,...,为这些常见的设置组合各生成一个Prototype对象,需要创建一个某种配置的对象时,就从对应的Prototype对象Copy一个就好了。
------解决方案--------------------
举出我实际开发中一个例子:
GUI中,不同的界面控件需要一个Style来指定样式(字体,字体颜色,前景,背景颜色,位图字体等等),很多时候,你只需要在系统默认的或者已有的Style基础上修改一个,比如字体,那么如果从头来初始化一个Style是没有必要的.这时候,prototype就有了用武之地,那就是Style类支持clone,这样只需要在已有Style基础上clone一个,再修改需要需求属性就可以了.简单快速.理解没?