MyException - 我的异常网
当前位置:我的异常网» 设计模式 » 什么时候用Prototype模式?解决办法

什么时候用Prototype模式?解决办法

www.MyException.Cn  网友分享于:2013-03-07  浏览:11次
什么时候用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端无法直接创建对象。对于后者,看下面的例子:

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一个,再修改需要需求属性就可以了.简单快速.理解没?

文章评论

编程语言是女人
编程语言是女人
总结2014中国互联网十大段子
总结2014中国互联网十大段子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
一个程序员的时间管理
一个程序员的时间管理
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
漫画:程序员的工作
漫画:程序员的工作
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
10个调试和排错的小建议
10个调试和排错的小建议
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员的鄙视链
程序员的鄙视链
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
 程序员的样子
程序员的样子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
旅行,写作,编程
旅行,写作,编程
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java程序员必看电影
Java程序员必看电影
程序员都该阅读的书
程序员都该阅读的书
老程序员的下场
老程序员的下场
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
鲜为人知的编程真相
鲜为人知的编程真相
我的丈夫是个程序员
我的丈夫是个程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我是如何打败拖延症的
我是如何打败拖延症的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员和编码员之间的区别
程序员和编码员之间的区别
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
代码女神横空出世
代码女神横空出世
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
中美印日四国程序员比较
中美印日四国程序员比较
如何成为一名黑客
如何成为一名黑客
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有