盒子
盒子
文章目录
  1. 单例模式
  2. 优点
  3. 单例模式的几种实现
    1. 饿汉式
    2. 懒汉式+双重判断
    3. 静态内部类实现

设计模式之单例模式

单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点


优点

  • 在内存中只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
  • 避免对资源的多重占用

单例模式的几种实现

饿汉式

类加载时就把对象创建出来,用的时候直接返回。但是存在一个问题,就是单例还没有被使用就已经创建了,如果程序一直没有使用这个单例的话,就造成了不必要的资源浪费

1
2
3
4
5
6
7
8
public class ImageLoader{  

private static ImageLoader instance = new ImageLoader();
private ImageLoader(){}
public static ImageLoader getInstance(){
return instance;
}
}

懒汉式+双重判断

一开始什么都不做,只有在使用的时候才创建实例对象。为了避免锁带来的性能问题,使用了双重判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ImageLoader{  
private static ImageLoader instance;
private ImageLoader(){}
public static ImageLoader getInstance(){
if(instance == null){
synchronized (ImageLoader.class){
if(instance == null){
instance = new ImageLoader();
}
}
}
return instance;
}
}

静态内部类实现

并未加锁,因为第一次加载ImageLoader类时,并不会实例化单例对象,只有第一次调用getInstance()方法时会导致虚拟机加载InnerInstance类,这种方式不仅能保证对象的单一性,还避免加锁带来的性能问题,又启动了延迟加载的优化,所以推荐使用这种方式。

1
2
3
4
5
6
7
8
9
public class ImageLoader{  
private static class InnerInstance{
private static final ImageLoader instance = new ImageLoader();
}
private ImageLoader(){}
public static ImageLoader ImageLoader(){
return InnerInstance.instance;
}
}