设计模式综合实战项目x-gen 系列四

  • Post author:
  • Post category:其他


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() {


//创



版权声明:本文为weixin_44069186原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。