单例模式:顾名思义,如果一个类只能创建一个实例,则这个类被称为单例类,这种模式被称为单例模式
一.普通单例模式
普通单例模式创建步骤基本是固定的,即:
1.私有化无参构造器;
2.创建私有化的静态的单例类变量;
3. 创建public 的方法,返回单例类对象
根据创建私有化静态变量时的初始化不同,分为两种创建方法:饿汉式和懒汉式,见下面代码:
饿汉式与懒汉式的区别在于,饿汉式在创建私有化的静态单例变量时直接赋值为本单例类对象,而不是在公共方法中再创建本单例类对象,因为饿,等不及了嘛。而懒汉式,因为懒,所以只在逼不得已的情况下采取创建对象。
饿汉式(推荐使用):
class Singleton {
// 1.私有化无参构造器
private Singleton() {
}
// 2.创建私有化的静态的单例类变量,并赋值为新建的单例类对象
private static Singleton instance = new Singleton();
// 3.创建public 的静态方法,返回值为单例类变量
public static Singleton getInstance() {
return instance;
}
}懒汉式:class Singleton {
// 1.私有化无参构造器
private Singleton() {
}
// 2.创建私有化的静态的单例类变量
private static Singleton instance;
// 3.创建public 的静态方法,判断单例类变量是否为null.如果是null,则创建一个新的对象并赋值,否则直接返回
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}由于懒汉式存在线程安全问题,所以最好修改为线程安全的,如下:class Singleton {
private Singleton() {
}
private static Singleton instance = null;
public static Singleton getInstance() {
// 使用同步机制,确保线程安全
// 在同步块外加一个if判断,提高效率。如果instance实例已存在,就不用再等同步块执行结束之后再返回了,可直接返回
if (instance == null) {
synchronized (Singleton.class) {// 在静态方法中不能使用this关键字,所以可以使用当前类的Class对象来充当同步监视器,也就是锁
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
综上,由于懒汉式比较复杂,所以如果写单例模式的话,懒汉式和饿汉式相比,最好写饿汉式,比较简单。
二.枚举单例模式
这里的主角不再是类,而是一个枚举。
创建代码如下:
enum Single {
INSTANCE;
public void hhda() {
System.out.println("heheda");
}
}
public class Test2 {
public static void main(String[] args) {
Single s = Single.INSTANCE;
Single s2 = Single.INSTANCE;
System.out.println(s.hashCode() == s2.hashCode());
s.hhda();
}
}
本文介绍了单例模式的两种实现方式——饿汉式和懒汉式,对比了它们的区别,并推荐了使用饿汉式。此外,还介绍了一种利用枚举实现单例模式的方法。

3万+

被折叠的 条评论
为什么被折叠?



