9.3.1 单例模式
9.3.1 单例模式
有些时候,允许自由创建某个类的实例没有意义,还可能造成系统性能下降(因为创建对象所带来的系统开销问题)。例如整个系统只有一个窗口管理器,只有一个假脱机打印设备;在Java EE
应用中可能只需要一个数据库引擎访问点, Hibernate
访问时只需要一个SessionFactory
实例,如果在系统中为它们创建多个实例就没有太大的意义。
如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。
对Spring
框架而言,可以在配置Bean
实例时指定scope="singleton"
来配置单例模式。不仅如此,如果配置<bean>
元素时没有指定scope
属性,则该Bean
实例默认是单例的行为方式。Spring
推荐将所有业务逻辑组件、**DAO
组件、数据源组件**等配置成单例的行为方式,因为这些组件无须保存任何用户状态,故所有客户端都可共享这些业务逻辑组件、DAO
组件,因此推荐将这些组件配置成单例模式的行为方式。
即使不借助Spring
框架,也可手动实现单例模式。为了保证该类只能产生一个实例,程序不能允许自由创建该类的对象,而是只允许为该类创建一个对象。
实现单例模式的步骤
- 为了避免程序自由创建该类的实例,使用
private
修饰该类的构造器,从而将该类的构造器隐藏起来。 - 将该类的构造器隐藏起来之后,则需要提供一个
public
方法用于创建该类的对象,因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象只能是类,所以该方法必须使用static
修饰。 - 除此之外,该类还必须缓存已经创建的对象,否则该类无法知道是否曾经创建过实例,也就无法保证只创建一个实例。为此该类需要使用一个属性来保存曾经创建的实例,因为该属性需要被静态方法访问,所以该属性要使用
static
修饰.
单例类实例
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\Singleton\src |
基于上面的介绍,下面的程序创建了一个单例类。
1 | public class Singleton |
测试类:
1 | public class SingletonTest |
在Java EE
应用中,单例模式是一种应用非常广泛的设计模式,应用中许多组件都只需要单个实例下面介绍的工厂模式里的工厂也只需要单个实例。
单例模式优势
使用单例模式主要有如下两个优势。
- 减少创建
Java
实例所带来的系统开销。 - 便于系统跟踪单个
Java
实例的生命周期、实例状态等。