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

《Head First设计形式》阅读笔记.第五章

2012-11-01 
《Head First设计模式》阅读笔记.第五章1.单件(单态,Singleton)模式部分*有些对象我们只需要一个,比如说:线

《Head First设计模式》阅读笔记.第五章
1.单件(单态,Singleton)模式部分

*有些对象我们只需要一个,比如说:线程池(threadpool)、缓存(cache)、对话框()、处理偏好设置的对象、处理注册表(register)的对象、日志对象,以及充当打印机、显卡等设备的驱动程序对象。这些对象只能有一个实例,如果出现多个实例就会导致程序的行为异常、资源使用过量,或者产生的结果不一致等等问题。

*单件模式与全局静态变量的区别:
(1)使用全局静态变量需要程序员之间的约定才能保证只有一个实例,而单件模式无需这样的约定就可以确保只有一个实例被创建。
(2)静态变量在程序一开始就被创建(这取决于JVM的实现),而单件模式只是在使用时才创建对象。如果这个被创建的对象非常消耗资源,而在程序运行的过程中没有用到它,就会造成很大的浪费,这是静态变量的缺点。

*在单态模式中,如果不需要这个实例,它就永远不会被创建。这就是“延迟实例化(Lazy Instance)”。

*单件模式的应用场景之一是设置类对象,比如注册表设置(Register Setting)对象。如果设置对象有多份拷贝,就会把设置搞得一团糟。

*单件常用来管理共享的资源,比如数据库连接池或线程池。

单件(Singleton)模式:确保一个类只有一个实例,并提供一个全局访问点。

*多线程会影响到单件模式,如果不对它进行处理就会在单件模式下仍然创建多于一个实例。
解决这个问题有以下三种方式:
(1)使用同步。但是简单地给创建实例方法(getInstance())增加synchronized修饰符虽然可以解决多线程的问题,但是导致每次调用都同步,而在静态变量被设置之后,同步就是多余的了,因此,这降低了程序的效率。
在程序频繁运行的地方增加同步可能会使效率降低100倍!因此要尽量避免使用同步,如果使用,就要尽量缩减需要同步的代码。
方法如下:

public class LogFactory {private volatile static LogFactory instance;private LogFactory() {}public static LogFactory getInstance() {if (instance == null) {synchronized (LogFactory.class) {if (instance == null) {instance = new LogFactory();}}}return instance;}}


--END--

热点排行