单例模式

  面试题遇到写一个“单例模式” ,哭唧唧。

  曾经精通二十多种(常用)设计模式的我,因为太久没复习,忘得一干二净了......呜呜呜,幸亏过后想到了,不知道有没有错~~

  现在复习一下单例模式,为什么?可能现在用得还比较少吧,所以觉得没什么用,但意义总是迟来的。学多点总是没错的嘛~

单例的好处:https://www.cnblogs.com/seesea125/archive/2012/04/05/2433463.html  附上链接。

  

  单例分懒汉式饿汉式:

懒汉式:

public class Singleton {
    private volatile static Singleton instance = null;
    // 私有化构造方法
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

  懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。懒汉式是定性的时间换空间,如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例,因此需要加锁解决线程同步问题。单例模式的懒汉式体现了缓存的思想,延时加载就是一开始不要加载资源或者数据,一直 等,等到马上就要使用这个资源的或者数据了,躲不过去了才去加载。

饿汉式:

public class Singleton {
    private static Singleton instance = new Singleton();
 
    // 私有化构造方法
    private Singleton() {
 
    }
 
    public static Singleton getInstance() {
        return instance;
}

  从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。

  饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。

  它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。
  

  

原文地址:https://www.cnblogs.com/fzzzjjj/p/11574401.html