定义
单例模式(Singleton Pattern):
Ensure a class has only one instance, and provide a global point of access to it.
译:确保某个类只有一个实例对象,并且提供一个全局的访问入口
类图
解读一下:
这个单例类的构造方法需要是私有的,并且有一个静态的内部实例对象,然后提供对外获取该类实例的静态方法getInstance()
。
访问时只需要Singleton.getInstance()
就可以获得该类实例,并进行使用
优缺点及注意事项
1. 优点:
只有一个对象,减少内存的占用,特别创建对象和销毁对象比较耗时耗性能的情况下更加合适。
可以很方便的做到单线程的读写,比如写文件避免两个对象同时操作引发一些异常。
不会频繁的创建和销毁对象,减少JAVA频繁GC
2. 缺点:
不能很好的进行扩展,每次新加功能都需要修改原类。
3.注意事项:
在客户端开发时,需要注意单例类对Context的引用,避免引用而内存泄露。
注意单例类对象的创建时间,避免多线程访问引发空指针的问题
使用场景
IO访问、数据库访问、整个应用只需要一个统一的资源管理类、工具类等
实现方式
1.方式一
public class Singleton {
private final static Singleton mSingleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return mSingleton;
}
}
2.方式二
public class Singleton {
private static Singleton mSingleton = null;
private Singleton() {
}
public static Singleton getInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
// 进入同步块仍需要判断是否已经new出对象来了
if (mSingleton == null) {
mSingleton = new Singleton();
}
}
}
return mSingleton;
}
}
3.方式三
public class Singleton {
private Singleton() {
}
private static class Holder {
private static final Singleton mSingleton = new Singleton();
}
public static Singleton getInstance() {
return Holder.mSingleton;
}
}
此方式也算是延迟初始化,但不用考虑多线程问题,类似第一种方式,在初始化类的时候,直接生成对象