从0开始的java设计模式1:单例模式
原创作品,未经允许,不得转载
0是开始,也是结束
通常我们说java有23种常见的设计模式,可是在实际工作中我连常见的几种都很少使用过,
本系列算是自己对java设计模式的学习和探索
废话不多说,进入正题
为什么要是用单例模式?
所有的设计模式都是为了解决一类问题而出现的方案.,要想知道什么是单例模式就首先要知道单例模式的使用场景,
所谓单例,就是独一份,全世界就这么一个东西,不可能有第二个出现.强调的是唯一性.
对于这个对象所对应的类来说,这个对象就代表了这个类,它是一个孤家寡人,
想想我们接触过的那些业务,什么时候要强制保证只有一个对象存在?
读取服务器配置文件时需不需要?需要.为什么呢?一个服务器的配置文件是固定的,就那一个,你用一个类来处理读取配置文件这个事,
然后接下来无论你new 多少对象,干的都是同样的事,而且,你每次new这个类的新的对象,都是要占内存资源的,所以这种情况下要保证读取配置
文件的对象独一份是没问题的.
Spring中读取配置文件后创建的bean默认是单例的,这是为什么啊,.Spring中的bean都是通过读配置文件或者找注解生成的.你用,它就返回给你一个.
如果我们在系统中大量创建bean对象,会不会造成内存爆满,程序崩溃?要知道new对象也是非常消耗资源的,何况还要把不用的给销毁掉.我们知道Spring基本上
就是在解决web的问题,对于一次web请求,controller,service,dao全走一次,假如每次都要创建一个对象,用完再销毁,可能不会太明显,但是假如请求数量是一个非常大
的数字,你的服务器还能正常运转吗?所以单例,也是在解决频繁的对象创建和销毁的问题.
什么是单例模式?
顺着上边我们分析的要解决的两个问题,我们可以对单例模式下个定义,单例模式其实就是一种用来解决全局系统对象调用问题和对象频繁生成销毁问题的方案.
根据我们的定义,我们可以分析出来单例模式要具备两个特征:
1.只创建一次
2.不能让你new,但是得给你一个获取这个单例对象的方法
怎么使用单例模式?
有好多种,精力有限,所以只能捡其中的三种说:
第一种:懒汉

懒加载,只有在调用获取实例的方法时才会给你个对象,

地址一样,说明我们不管调用几次,这个Person都是唯一的.
but,如果是多线程呢?

很明显,创建了两个对象,这就背离初衷了,所以我们可以对这个Peron类进行加锁,强制要求多线程同步
第二种:懒汉改良版

再次使用多线程调用:

这下连多线程也可以一样了,是不是就代表这个方法已经很好了呢?肯定不啊,本来多线程是提高程序执行效率.
但是强制使用synchronized加锁之后对于锁的资源占用和释放也是一笔开销,这个方法只能算是拆了东墙补西墙
第三种:饿汉

二话不说直接在类加载的时候new一个给你,爱用不用,用给你方法,简单明了,
由于是在类加载时就创建了,所以多线程调用也不会有问题
第四种:静态内部类

兼具了懒汉的延迟加载,又解决了多线程的问题,其实相当于懒汉和饿汉的合体.
静态内部类,只有当使用的时候才会进行加载,而且只加载一次,首次加载之后,再次调用获取实例的方法,仍然是第一次创建的实例


浙公网安备 33010602011771号