本帖最后由 杨永峰 于 2012-5-25 22:58 编辑
首先,单例模式的使用是为了保证一个类在内存中最多只存在一个对象(实例)
当某个类的初始化比较耗,耗资源的时候,比如加载某些配置文件等,会选择单例模式,单例模式一般用在不需要实例化多个对象的地方 。
常用的单例模式的实现有两种,分别是懒汉式和饿汉式,饿汉式需要使用多线程同步的技术。
为了保证对象的唯一性,单例模式的实现过程中需要满足三个要求:
1>外部程序不能直接使用该类创建其对象。
2>为了使外部程序使用唯一的对象,本类自身需要在内部创建一个对象。
3>为外部程序获取对象提供公用的方法。
可能懒汉式和饿汉式的两种不用实现方式的区别更加重要
饿汉式:类被加载到内存的时候,对象随着类的初始化而创建- class Single
- {
- private static Single s = new Single(); // 直接创建静态私有的 s
- private Single(){}
- public static Single getInstance()
- {
- return s; //通过public 方法返回对象,保证了对象的唯一性,由于返回结果只存在一种情况,所以不涉及不同步的问题。
- }
- }
复制代码 懒汉式:类被加载到内存,初始化,对象并未创建,直到外部程序调用获取对象的方法时,开始创建对象。- class Single
- {
- private static Single s = null; //
- private Single(){}
- //public static synchronized Single getInstance() // 在这加锁的话,影响运行效率,每次调用前都需要判断。
- public static Single getInstance()
- {
- if(s==null)
- {
- synchronized(Single.class) // 需要考虑多线程的同步问题,虽然问题解决了,但是代码增加不少。
- {
- if(s==null)
- s = new Single(); // 满足条件,创建对象。
- }
- }
- return s;
- }
- }
复制代码 综合考虑程序的运行效率和有效性,实现单例模式时,建议优先考虑饿汉式。 |