title: Singleton模式
tag: 笔记 设计模式
Singleton模式
在程序运行中,通常都会生成很多实例。比如当我们需要1000个Car的时候,我们就会有1000个Car的实例。
但在有的时候,我们想在程序中表示某个东西仅有一个时,就需要只能创建一个实例的需求。典型的例子有表示程序所运行于的那台计算机的类、表示软件系统相关设置的类,以及表示视窗系统(window system)的类。
我们可以通过确保仅仅使用一个new来生成实例即可实现这样的需求,但这样会使我们在编程时时时注意才能够实现。这个时候我们就可以使用Singleton
模式。
- 想确保任何情况下都绝对只有1个实例
- 想在程序上表现出“只存在一个实例”
像这样的确保只生成一个实例的模式被称作Singleton
模式。Singleton
是指只含有一个元素的集合。因为本模式只能生成一个实例,因此以Singleton
命名。
示例程序
Singleton
模式仅仅只是涉及一个类,因此示例程序仅仅包含一个Singleton
类:
Singleton类
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton(){
System.out.println("生成了一个实例。");
}
public static Singleton getInstance(){
return singleton;
}
}
该类只会生成一个实例。Singleton
声明了一个静态(static
)字段singleton
,并将其初始化为Singleton
的实例。初始化仅在类加载时进行一次。
Singleton类的构造函数是Private的,这是为防止从Singleton类外部调用构造函数。如果从Singleton
类以外的代码中调用构造函数new Singleton()
,就会出现编译错误。如果程序员十分小心,不会使用new关键字生成实例,就不需要定义构造函数为private
。但是这样的话,Singleton
模式也就没有意义了。Singleton
模式的作用在于可以确保任何情况下都只能生成一个实例。为了达到这个目的,必须设置构造函数为private
。
为了便于测试Singleton
类的行为,我们在构造函数中输出了“生成了一个实例。”这一信息。
我们还准备了getInstance
方法,以便于程序从Singleton
类外部获取Singleton
类唯的实例。在本例中,方法名为getInstance,不过并不是必须用这个名字。但是作为获取唯一实例的方法,通常情况下都会这样为其命名。
测试
我们想知道从Singleton
类获得的实例是否都是同一个,我们编写下面的程序来测试:
public static void main(String[] args) {
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 == obj2){
System.out.println("生成了同一个实例");
}else{
System.out.println("生成了两个不同的实例");
}
}
输出:
生成了一个实例。
生成了同一个实例
从结果可以知道,Singleton
类的构造方法仅被调用了一次,并且我们从类中获取的两个实例是相同的。
Singleton模式中登场的角色
- Singleton
在Singleton
模式中,只有Singleton
这一个角色。Singleton
角色中有一个返回唯一实例的static
方法。该方法总是会返回同一个实例。
UML类图:
相关的设计模式
在以下模式中,多数情况下只会生成一个实例:
AbstractFactory
模式Builder
模式Facade
模式Prototype
模式
相关的设计模式
在以下模式中,多数情况下只会生成一个实例:
AbstractFactory
模式Builder
模式Facade
模式Prototype
模式