5.2 解 决 方 案

5.2.1 使用单例模式来解决问题

用来解决上述问题的一个合理的解决方案就是单例模式(Singleton)。那么什么是单例模式呢?

1.单例模式的定义

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2.应用单例模式来解决问题的思路

仔细分析上面的问题,现在一个类能够被创建多个实例,问题的根源在于类的构造方法是公开的,也就是可以让类的外部来通过构造方法创建多个实例。换句话说,只要类的构造方法能让类的外部访问,就没有办法去控制外部来创建这个类的实例个数。

要想控制一个类只被创建一个实例,那么首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法,这就是单例模式的实现方式。

5.2.2 单例模式的结构和说明

单例模式的结构如图5.1所示。

图片

图5.1 单例模式结构图

Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。

5.2.3 单例模式示例代码

在Java中,单例模式的实现又分为两种,一种称为懒汉式,一种称为饿汉式,其实就是在具体创建对象实例的处理上,有不同的实现方式。下面分别来看看这两种实现方式的代码示例。为何这么写,具体在后面再来讲述。

(1)懒汉式实现示例代码如下:

b89266c7c70a4b1aa45702b1fde3af64

a961666a5b5a4092bb04c93a6531db01

(2)饿汉式实现,示例代码如下:

01eb085d9a404f028dacfe272d8b9b7b

ccf23d65fff4444f91dad864b18cd305

15d335a3816c4479a50ace025bc416e2

关于饿汉式、懒汉式的名称说明:

饿汉式、懒汉式其实是一种比较形象的称谓。

所谓饿汉式,既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是就在装载类的时候就创建对象实例,写法如下:

图片

所谓懒汉式,既然是懒,那么在创建对象实例的时候就不着急,会一直等到马上要使用对象实例的时候才会创建,懒人嘛,总是推托不开的时候才去真正执行工作,因此在装载对象的时候不创建对象实例,写法如下:

图片

延伸

而是等到第一次使用的时候,才去创建实例,也就是在getInstance方法里面去判断和创建

5.2.4 使用单例模式重写示例

由于单例模式有两种实现方式,这里选择一种来实现就可以了,我们选择饿汉式的实现方式来重写示例吧。

采用饿汉式的实现方式来重写实例的示例代码如下:

dd62a602ec34486499b25070331276d9

dee3cbba65d943ee8a8662ab81534faa

be33547c28b04ffa8591185dfec36ab6

53796dfbc69a4aa7a10462c7f41510ad

当然,测试的客户端也需要相应地变化。示例代码如下:

52d53b2b302f4be08d3ee052b72799ed

测试看看,是否能满足要求。