I walk very slowly, but I never walk backwards
设计模式 - 单例模式(上)
寂然
大家好~,我是寂然,本节课呢,我们正式进入设计模式的学习,第一个要聊的就是我们最常见的,同时也是面试高频的单例模式,那老规矩,我们直接启程吧
五重境界
在此之前,我们闲聊两句,因为有的小伙伴问到一个问题,怎么才算是学会或者说掌握设计模式了呢?那我们一起来聊聊这个话题,会有很多人说其实这个不好去定义,但是如果自己平时写代码,无意识,习惯成自然的用到了设计模式,遇到实际问题,很快就能对比选择,使用合适的设计模式,低耦合,合理的解决掉实际问题,我觉得就是很好的掌握了,网上有人分享了设计模式的五重境界,感觉很贴切,这里也拿来和大家分享下
第 1 层:刚开始学编程不久,听说过什么是设计模式 ,但不了解
第 2 层:有很长时间的编程经验了,自己写了很多代码,其中用到了设计模式,但是自己却不知道
第 3 层:学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的
第 4 层:阅读了很多别人写的源码和框架,其中看到了设计模式,能够领会设计模式的精妙和带来的好处
第 5 层:代码写着写着,自己都没有意识到使用了设计模式,并且熟练的写了出来
问题答疑
同时,在开始之间还要和大家强调一句话,因为很多小伙伴都有说或者脑海中有这样一个疑问:这样就可以啊,为什么非要这么复杂呢,大家要注意,设计模式不仅仅是站在实现功能的角度上,而是立足于整个软件系统的设计,所以大家要学会在学习的过程中,总结和对比思考,可以达到事半功倍的效果
官方定义
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例并且该类只提供一个取得其对象实例的方法(静态方法)
举个最常见的例子,Spring 中的 bean 默认都是单例模式,每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例
单例模式八种方式
那接下来我们来聊聊单例模式的八种实现方式,如下所示
饿汉式(静态常量)
饿汉式(静态代码块)
懒汉式(线程不安全)
懒汉式(线程安全,同步方法)
懒汉式(线程安全,同步代码块)
双重检查
静态内部类
枚举方式
饿汉式(静态常量)
饿汉式之静态常量的写法如下:
一,构造器私有化(防止外部通过new + 构造器的方式创建对象实例)
二,类的内部创建对象(创建final,static的实例对象)
三,对外暴露一个公共的静态方法(通过该方法,返回该类唯一的对象实例)
// 饿汉式(静态变量)
class Singleton{
//一 构造器私有化
private Singleton(){
}
//类的内部创建对象
private final static Singleton singleton = new Singleton();
//对外提供公共的,静态的方法
public static Singleton getInstance(){
return singleton;
}
}
public class SingletonDemo {
public static <