单例模式
面试题遇到写一个“单例模式” ,哭唧唧。
曾经精通二十多种(常用)设计模式的我,因为太久没复习,忘得一干二净了......呜呜呜,幸亏过后想到了,不知道有没有错~~
现在复习一下单例模式,为什么?可能现在用得还比较少吧,所以觉得没什么用,但意义总是迟来的。学多点总是没错的嘛~
单例的好处: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的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。
饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。
它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。