1 加入单例模式
1:面临的问题
看看上面的基本实现,会发现一些问题:
Ø如果GenConfEbo被创建多次的话,那么就会重复获取配置数据,浪费程序运行时间;
Ø并且每个GenConfEbo的实例都会缓存这些数据,浪费内存空间。
Ø同一个类里面,既有实现GenConfEbi要求的对外功能,又有内部实现需要的获取配置数据和缓存数据的功能,从类的设计上来说,这个类的职责太不单一了,应该分离一部分职责出去。
因此这种实现肯定是不好的,那么怎么解决呢?
2:用单例模式来解决
(1):模式定义:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
(2):模式本质:
单例模式的本质:控制实例数目。
(3):基础知识:
(1)单例模式是用来保证一个类在运行期间只会被创建一个类实例的
(2)单例模式还提供了一个全局唯一访问这个类实例的访问点,通常就是那个getInstance方法
(3)单例模式只关心类实例的创建问题,并不关心具体的业务功能。
(4)单例模式是一个虚拟机范围内单例,不适用于集群等环境
(5) 单例模式的实现有很多种,除了常见的懒汉式和饿汉式外,还有利用缓存来实现、双重检查加锁的实现、Lazyinitialization holder class模式、以及枚举的实现方式等
(6)使用单例模式的时候要注意它的线程安全性
(7)单例模式体现了延迟加载、缓存等常见的设计思想
(8)单例模式是可以很容易的扩展到多实例控制的
(4):常见应用场景:
用来控制不需要创建多个实例,但是又需要有实例的类,因为这些类可能有属性,这些属性可以缓存一些值,这些值只需要一份。
首先,单例模式控制了运行期间只创建一个类实例,这就意味着获取配置数据的功能只会被执行一次,从而节省运行的时间。
其次,单例类实例是可以有自己的属性的,也就是能把获取的配置数据缓存到这个单例类实例的属性中,这样一来,如果类实例只有一个,那么就能保证在内存里面缓存这些配置数据的空间只有一份,从而节省内存空间。
另外,并不是把GenConfEbo做成单例,而是把其中的获取配置数据和缓存配置数据的功能分离出来,单独做成一个单例类,这样使得这个类的职责分配都更为合理。
3:核心代码示例
(1)看看分离出来的单例实现,当然单例的实现方式又有很多种,这里选用饿汉式的实现方式,既简单又线程安全。示例代码如下:
/**
示意:配置管理的单例类,实现获取配置数据,缓存配置数据的管理
/
publicclass ConfManager {
privatestatic ConfManager instance = new ConfManager();
private ConfManager() {
//创