什么时候用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;
}