您的位置:首页 > 编程语言 > Java开发

《java与模式》笔记(十一) 单例模式

2006-09-05 12:33 337 查看
☆ 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。

§ 15.1 引言
☆ 一些资源管理器常常设计为单例模式,比如打印管理器、传真管理器、通讯端口管理器或者一些管理内部资源如配置文件管理器等。

☆ Windows的回收站是一个很好的单例的实际例子。

§ 15.2 单例模式的结构
☆ 单例模式的特点:
① 单例类只能有一个实例;
② 单例类必须自己创建自己的唯一实例;
③ 单例类必须给所有其他对象提供这一实例。

☆ 饿汉式单例类


public class EagerSingleton




...{




/** *//**


* 所谓饿汉式单例,就是直接在声明处实例化自身实例


*/


private static final EagerSingleton _instance = new EagerSingleton() ;






/** *//**


* 私有构造函数,确保类不会被其他客户端实例化。


*/




private EagerSingleton() ...{}






/** *//**


* 像整个应用提供唯一的实例。


*/


public static EagerSingleton getInstance()




...{


return _instance ;


}


}

☆ 懒汉式单例类


public class LazySingleton




...{




/** *//**


* 注意,懒汉式单例并没有在声明处实例化自身的实例。


*/


private static LazySingleton _instance = null ;






/** *//**


* 私有构造函数。


*/




private LazySingleton() ...{}






/** *//**


* 取得实例的方法,懒汉式单例在取得实例的方法里面去实例化自身。


* 注意,该方法应加线程锁,防止多线程环境下实例检测混乱。


*/


synchronized public static LazySingleton getInstance()




...{


if( null == _instance )


_instance = new LazySingleton() ;




return _instance ;


}


}



§ 15.4 单例类的状态
☆ 单例类中可以存在一些标识当前状态的属性,这个时候单例类就是有状态的,反之就是无状态的单例类。有状态的单例类常常用来当作状态库使用。

有状态的单例类实现起来要注意几点,一是设计的时候要考虑到多线程修改状态的问题,必要的地方加线程锁;二是在如EJB这样的多JVM技术框架,或者同一个JVM中有多个类加载器的情况下,尽量避免使用有状态的单例实现。

无状态的单例实现通常应该设计成不变类。

§ 15.5 Java语言中的单例模式
本节举java.lang.Runtime例,说明jkd中的单例应用。
比较有用的就是用Runtime.getRuntime().exec()来执行外部命令。

§ 15.7 不完全单例类


public class LazySingleton




...{




/** *//**


* 注意,懒汉式单例并没有在声明处实例化自身的实例。


*/


private static LazySingleton _instance = null ;






/** *//**


* 公有的构造函数,可以直接实例化。


*/




public LazySingleton() ...{}






/** *//**


* 取得实例的方法,懒汉式单例在取得实例的方法里面去实例化自身。


* 注意,该方法应加线程锁,防止多线程环境下实例检测失败。


*/


synchronized public static LazySingleton getInstance()




...{


if( null == _instance )


_instance = new LazySingleton() ;




return _instance ;


}


}



也叫默认实例模式,用户可以选择自己生成实例,也可以选择通过工厂方法得到的共享实例。这样等于把选择实例化方式的责任交给客户端,很难保证客户端正确使用该类。不建议作出这样的设计。

§ 15.8 相关模式
和单例模式关系最大的莫过于多例模式和简单工厂模式,不多写了。

☆ 最后一节以大量的篇幅说明“双重检测成例”在java下行不通,觉得有点无聊。
☆ 书中的登记式单例实现,怎么看怎么是个不完全单例,所以没有细研究。不知道是GOF当初就这么实现的还是让这老仙给改成这样的,有点乱七八糟。
☆ 总结一下,本章最有用的知识点:
一是单例的特点;
二是懒汉和饿汉两种单例的实现,其中懒汉式单例要注意多线程问题;
三是有状态单例严格禁止在分布式应用中使用;
四是不要作出所谓的“不完全单例”设计;
五是双重检查成例不要用java写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: