1.单例模式(Singleton)

package _1Singleton;

public class Singleton {
	
	private static Singleton singleton = new Singleton(1);
	
	private Singleton(int i)
	{
		System.out.println(i);
	}

	/**
	 * Solution 1 
	 * 在调用本类任何参数或方法时,singleton都将被实例化
	 * 
	 * @return
	 */
	public static Singleton getInstance()
	{
		return singleton;
	}
	
	/**
	 * Solution 2
	 * 在第一次调用的时候实例化,但是需要同步的开销
	 * 
	 * @return
	 */
    public static Singleton getInstance2() {
        if(singleton == null) {
           synchronized(Singleton.class) {
             if(singleton == null) {
               singleton = new Singleton(2);
             }
          }
        }
        return singleton;
      }
      
	/**
	 * Solution 3
	 * 在第一次调用的时候实例化,不需要同步
	 * 
	 * @return
	 */
      public static Singleton getInstance3() 
      {     
        return SingletonHolder.instance;
      }   
    
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton.getInstance();
	}
	
	private static class SingletonHolder
	{
		private static Singleton instance = new Singleton(3);
    }
}
 

上面列举了三种单例模式的实现方式,当然方案一是最简单的,建议使用。

单例的优点:

  1. 减少内存开销
  2. 减少系统性能开销
  3. 避免对资源的多重占用
  4. 单例模式可以在系统设置全局的访问点,优化和共享资源访问(例如一个单例类用来负责所有数据表的映射处理

单例的缺点:

  1. 单例模式一般没有接口,不容易扩展,功能改动时基本上只能修改代码
  2. 如果单例没有完成,无法进行测试工作
  3. 单例模式与单一职责原则有冲突。
  4. 需要保证线程安全

单例的应用场景:

  1. 要求省城唯一序列号的环境
  2. 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面的访问计数器
  3. 创建一个对象需要消耗的资源过多,如访问IO和数据库等资源
  4. 需要定义大量的静态常量和静态方法(如工具类)的环境

猜你喜欢

转载自wangwengcn.iteye.com/blog/1696376
今日推荐