5.2 解 决 方 案
5.2.1 使用单例模式来解决问题
用来解决上述问题的一个合理的解决方案就是单例模式(Singleton)。那么什么是单例模式呢?
1.单例模式的定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.应用单例模式来解决问题的思路
仔细分析上面的问题,现在一个类能够被创建多个实例,问题的根源在于类的构造方法是公开的,也就是可以让类的外部来通过构造方法创建多个实例。换句话说,只要类的构造方法能让类的外部访问,就没有办法去控制外部来创建这个类的实例个数。
要想控制一个类只被创建一个实例,那么首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法,这就是单例模式的实现方式。
5.2.2 单例模式的结构和说明
单例模式的结构如图5.1所示。
图5.1 单例模式结构图
Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。
5.2.3 单例模式示例代码
在Java中,单例模式的实现又分为两种,一种称为懒汉式,一种称为饿汉式,其实就是在具体创建对象实例的处理上,有不同的实现方式。下面分别来看看这两种实现方式的代码示例。为何这么写,具体在后面再来讲述。
(1)懒汉式实现示例代码如下:
(2)饿汉式实现,示例代码如下:
关于饿汉式、懒汉式的名称说明:
饿汉式、懒汉式其实是一种比较形象的称谓。
所谓饿汉式,既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是就在装载类的时候就创建对象实例,写法如下:
所谓懒汉式,既然是懒,那么在创建对象实例的时候就不着急,会一直等到马上要使用对象实例的时候才会创建,懒人嘛,总是推托不开的时候才去真正执行工作,因此在装载对象的时候不创建对象实例,写法如下:
延伸
而是等到第一次使用的时候,才去创建实例,也就是在getInstance方法里面去判断和创建
5.2.4 使用单例模式重写示例
由于单例模式有两种实现方式,这里选择一种来实现就可以了,我们选择饿汉式的实现方式来重写示例吧。
采用饿汉式的实现方式来重写实例的示例代码如下:
当然,测试的客户端也需要相应地变化。示例代码如下: