单例模式(Singleton)探究

来源:互联网 发布:淘宝打单怎么打 编辑:程序博客网 时间:2024/05/22 08:22

单例模式:顾名思义,如果一个类只能创建一个实例,则这个类被称为单例类,这种模式被称为单例模式

一.普通单例模式

普通单例模式创建步骤基本是固定的,即:

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();}}


0 0
原创粉丝点击