概念
单件模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Prototype Pattern
Ensure a class only has one instance, and provide a global point of access of it.
角色
单件类(Singleton):单件类可以创建出一个实例。
类图
单件模式代码示例
详见Java设计模式代码仓库的Prototype Pattern包
单件模式是如何保证创建唯一实例的?
以上传到代码仓库的Moon类代码为例。
Moon类构造函数定义为private
单件模式将构造函数定义为了私有,是为了防止外部直接实例化,阻止其他代码通过new
关键字直接创建实例,确保唯一性。
get方法为公有静态的
将getMoon()
函数定义成公有静态的原因是:静态方法属于类级别,无需创建类的实例,就可以直接调用。
客户端只需要通过类名调用方法。
Moon moon = Moon.getMoon();
get方法里进行判空
get
方法里进行判空的目的是:保证单例对象只在第一次被请求时才被创建。
将类变量定义为static
将类变量Moon
定位为静态的原因是,静态函数不能访问非静态变量。定义为static
后,便可在静态方法getMoon()
里进行访问。
总结
单件类的唯一实例由单件类由单件类本身控制,所以可以很好地控制用户何时访问它。
单件模式本身可能是整个设计模式中最简单的一个模式了,可是为什么今天我不先写之前软件工程方法学教过的工厂模式呢?
因为今天上Java设计模式的时候,老师在对单件模式具体实例代码中,关于类成员私有和静态方面提出很多问题(上述四个),但是我发现自己对Java最基础的这方面的知识掌握过于欠缺了。
例如通过将成员函数定义为私有防止外部实例化,静态函数不能访问非静态变量这些等等。
我觉得虽然单件模式在设计上很简单,但是在实现上如果要想保证一个类仅有一个实例的话,对Java语言特性的深刻了解是很重要的。
今天上了一课。