2.2 《硬啃设计模式》 第4章 如何管理全局信息?- 单件模式(Singleton Pattern)

单件模式可能是23种模式中最简单也被说得最多的模式了。

什么情况下可考虑用单件模式呢?
需要一致地管理全局信息时,可考虑用单件模式。

例:
某论坛需要对所有访问者显示当前在线人数、最高在线人数、今天谁生日等全局信息。
论坛很火热,我们不希望每次都要去读数据库,而希望通过一个类来管理这些信息。
你会怎样考虑这个设计?
如果每个访问者进入论坛,论坛程序都要去“运算”一下来获取这些信息,那岂不是要消耗掉大量的性能?

分析:
1.最高在线人数、今日谁生日这些信息,可以在数据库中获取,如果每一次页面刷新都去获取一次,实在是浪费性能。
2.当前在线人数在当前程序运行环境中可以获取,该数字是经常变的,有没有必要每次都重新获取呢?

单件模式的其中一种实现办法:

 单件1.png

说明:
1.在统一的地方管理全局的信息。
2.这些全局信息供程序其它地方读取,一般情况下是读数据,而不写数据,如果要写数据还需要处理写冲突。

上例中光用单件模式还不能完全解决问题,Singleton类中应该还需要写缓存的代码,将最高在线人数、今日谁生日缓存起来,使程序不必每次去读取数据库。

单件通过在内存中唯一的Singleton保证了数据的唯一,并克服了数据冲突,但如果应用在网络负载均衡环境就会出问题。
在网络负载均衡环境中,有多台服务器跑相同的程序,每台服务器上有一个Singleton,这样就会出问题,在软件设计时需要考虑这样的情况。
在网络负载均衡环境下,程序要避免使用静态变量,对于需要共享的数据可通过统一的状态服务来处理,也就是说专门用一个服务来管理这些全局数据,所有程序从这个服务中取数据,而不要再通过Singleton的静态方法。

 

 

请看下一文……
 
 
 

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

《硬啃设计模式》作者

www.umlonline.org创办人

 

张传波 CSDN认证博客专家 大大大火球
软件研发及管理分享大师,《火球-UML大战需求分析》作者,创新工场敏捷课程讲师,豆芽儿-软件研发人才成长社区(www.douya2.com)创始人,豆芽儿公众号原创作者
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页