设计模式是前辈们在多年开发工作中经验的总结,可以提高代码的可重用性、可靠性和规范性,让代码更容易理解,而单例模式是在Java中最重要、最简单、最常用的设计模式之一。
单例模式
通俗来说,单例模式就是某个类中持有对自己唯一的对象,并且只能通过外部接口访问的一个类。看起来有有点拗口,那就直接上代码吧。
单例模式有两种:懒汉模式、饿汉模式
饿汉模式构建思路:
- 创建一个该类的私有、静态成员变量并进行初始化
- 重写无参构造函数,修饰符改为私有
- 提供 getInstance() 方法供外部获取该类的实例
具体代码如下:
/**
* 饿汉模式
*
* @author huaian
*/
class HungrySingleton {
/**
* 1. 创建此类的private static成员变量,并进行初始化
*/
private static final HungrySingleton instance = new HungrySingleton();
/**
* 2. 构造方法私有化,不允许外部直接创建对象
* 避免外部创建多个实例
*/
private HungrySingleton(){
}
/**
* 3. 提供外部接口访问当前单例
* @return instance
*/
public static HungrySingleton getInstance() {
return instance;
}
}
懒汉模式构建思路:
- 创建此类的私有、静态成员变量(不进行初始化)
- 重写该类的无参构造函数,修饰符为 private
- 提供一个外部方法获取该类对象(此时需要初始化成员变量)
代码实现如下:
/**
* 懒汉单例
*
* @author huaian
*/
public class LazySingleton {
// 1. 构造方法私有化 ,不允许外界直接创建对象
private static LazySingleton instance;
// 2. 创建 private static 的对象实例,不进行初始化
private LazySingleton() {
}
// 3. 提供一个外部方法获取该对象实例(此时初始化对象)
public static LazySingleton getInstance() {
// 实例化对象
if (instance == null ){
instance = new LazySingleton();
}
return instance;
}
}
小结
- 相同点
无论是懒汉模式还是饿汉模式,其核心思想都是不变的:不允许外界直接创建该类的实例,只能通过提供的 getInstance() 方法获取该类对象。
- 不同点
- 两者最大的差别还是该类内部的实例什么时候初始化。于是乎,方便记忆,可以这样理解:懒汉模式比较懒,所以需要用到的时候才会初始化该类的实例。反之就是饿汉模式(饿汉比较饿,所以急,类加载时就创建了实例对象)。
- 对于上述例子,饿汉模式是线程安全的,懒汉模式是线程不安全的。
- 第一点中提到,最大的区别是不用时间点实例化对象。那么这就决定了两种模式的效率(见下表格,效率是两种模式相对而言)。
设计模式 类加载效率 获取对象实例效率 懒汉模式 高 低 饿汉模式 低 高
人若无名,专心练剑!
喜欢的朋友可以留下你的赞!