Singleton模式


title: Singleton模式
tag: 笔记 设计模式


image-20231020164054547

Singleton模式

在程序运行中,通常都会生成很多实例。比如当我们需要1000个Car的时候,我们就会有1000个Car的实例。

但在有的时候,我们想在程序中表示某个东西仅有一个时,就需要只能创建一个实例的需求。典型的例子有表示程序所运行于的那台计算机的类、表示软件系统相关设置的类,以及表示视窗系统(window system)的类。

我们可以通过确保仅仅使用一个new来生成实例即可实现这样的需求,但这样会使我们在编程时时时注意才能够实现。这个时候我们就可以使用Singleton模式。

  • 想确保任何情况下都绝对只有1个实例
  • 想在程序上表现出“只存在一个实例”

像这样的确保只生成一个实例的模式被称作Singleton模式Singleton是指只含有一个元素的集合。因为本模式只能生成一个实例,因此以Singleton命名。

示例程序

Singleton模式仅仅只是涉及一个类,因此示例程序仅仅包含一个Singleton类:

image-20231021204910698

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类图:

image-20231021210740487

相关的设计模式

在以下模式中,多数情况下只会生成一个实例:

  • AbstractFactory模式
  • Builder模式
  • Facade模式
  • Prototype模式
    相关的设计模式

在以下模式中,多数情况下只会生成一个实例:

  • AbstractFactory模式
  • Builder模式
  • Facade模式
  • Prototype模式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值