什么是单例模式?
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式常见的写法有: 懒汉式单例,饿汉式单例,登记式单例(可忽略)。
单例模式的特点:
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一对象实例
懒汉式单例:
懒汉式单例在第一次调用的时候初始化 懒汉式单例是线程不安全的,在并发的情况下,可能出现多个Singleton实例,要实现线程安全需要对getInstance()进行改造,以确保线程安全和浪费内存。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须通过synchronized加锁保证单例,但加锁会影响效率。
public class Singleton {
// 类定义声明
private static Singleton mSingleton = null;
// 私有构造方法
private Singleton() { }
// 懒汉式单例在第一次调用的时候初始化 ,如此写法是线程不安全的,当有多个请求(并发)同时
调用getInstance时,可能会产生多个实例
private static Singleton getInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();
}
return mSingleton;
}
}
饿汉式单例
饿汉式单例在类初始时已经实例化,线程安全。
优点:没有加锁,执行效率会提高。
缺点:每次加载类都会实例化一次,浪费内存,产生多余的垃圾。
public class Singleton {
// 饿汉式单例在类初始化的时候完成实例化
private static final Singleton mIntance = new Singleton();
// 私有构造函数
private Singleton(){}
public static Singleton getInstance() {
return mIntance;
}
}