设计模式——单例

单例模式,可能是所有开发人员都了解的一种设计模式,但是又有大部分人对单例模式只是仅仅会用,这个对于求知欲极强的我来说怎么可能, 那么一定要把它搞明白了。

单例模式定义: 保证一个类中只存在一个对象实例,并提供一个唯一的访问点

单例模式说来就话长了,因为他有好多种写法,下面我要一一列举出来。 Come On!

1.饿汉模式

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){

    }

    public static Singleton getInstance{
        return instance;
    }
}

这种方式叫做饿汉式,这种方式在类加载的时候就完成了初始化操作,所以类加载起来会慢,但是获取对象的速度就会变快。 这种方式避免了多线程的同步操作问题。

2.懒汉模式(线程不安全)

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){
    }   
    public static Singleton getInstance() {  
        if (instance == null) {  
          instance = new Singleton();  
        }  
        return instance; 
    }  
  }

懒汉模式申明了一个静态对象,在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。

3.懒汉模式(线程安全)

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

这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。

4. 静态内部类单例模式

public class Singleton { 
    private Singleton(){
    }
    public static Singleton getInstance(){  
        return SingletonHolder.sInstance;  
    }  
    private static class SingletonHolder {  
        private static final Singleton sInstance = new Singleton();  
    }  
}

第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。

5. 枚举单例

public enum Singleton {  
   INSTANCE;  
   public void doSomeThing() {  
   }  
 }

####总结####
常用的一些单例模式基本上都讲完啦, 大家有什么问题可以在下面留言。设计模式打算做成一个系列,也算是自己做一些笔记,一举两得。