Singleton模式

程序在运行时,通常都会生成很多实例.例如,表示字符串的Java.lang.String类的实例与字符串是一对一的关系,所以当有1000个字符串的时候,会生成1000个实例.
但是,当我们想在程序中表示某个东西只会存在一个时,就会有"只能创建一个实例"的需求.典型的例子有表示程序所运行于 的那台计算机的类,表示软件系统相关设置的类,以及表示视窗系统(window system)的类.
当然,只要我们在编写程序时多加注意,确保只调用一次new MyClass(),就可以达到只生成一个实例的目的.但是,如果我们不不想"必须多加注意才能确保生成一个实例",而是要达到如下目的时,应当怎么做呢?
1.想确保任何情况下都绝对只有1个实例
2.想在程序上表现出"只存在一个实例"
像这样的确保只生成一个实例的模式被称作Singleton模式.Singleton是指只含有一个元素的集合.因为本模式只能生成一个实例,因此以Singleton命名
实例程序
在这里插入图片描述Singleton类
Singleton类只会生成一个实例.Singleton类定义了static字段singleton,并将其初始化为Singleton类的实例.初始化行为仅在该类被加载时进行一次.
Singleton类的构造函数是Private的,这是为了禁止从Singleton类外部调用构造函数.如果从Singleton类以外的代码中调用构造函数new Singleton(),就会出现变异错误.如果程序员十分小心,不会使用new关键字生成实例,就不需要定义构造函数为private.但是这样的话,Singleton模式 也就没有了意义.Singleton模式的作用在于可以确保任何情况下都只能生成一个实例.为了达到这个目的,必须设置构造函数为Private.
为了便于测试Singleton类的行为,我们在构造函数中输出了"生成了一个实例".这一信息.
我们还准备了getInstance方法,以便于程序从Singleton类外部获取Singleton类唯一的实例.在本例中,方法名为getInstance,不过并不是必须用这个名字.但是作为获取唯一实例的方法,通常情况下都会为其命名.
Singleton类(Singleton.java)

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){
        System.out.println("生成了一个实例.");
    }
    public static Singleton getInstance(){
        return singleton;
    }
}

Main类
Main类使用了Singleton模式.在Main类中,我们调用了两次Singleton类的getInstance方法,来获取Singleton类的实例,并将返回值分别保存在obj1和obj2中.然后通过表达式obj1==obj2是否成立判断obj1和obj2是否为同一个实例
使用Singleton模式的Main类(Main.java)

public class Main {

    public static void main(String[] args) {
        System.out.println("Start.");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();
        if (obj1==obj2){
            System.out.println("obj1与obj2是相同的实例.");
        }else{
            System.out.println("obj1与obj2是不同的实例.");
        }
        System.out.println("End.");
    }
}

运行结果

"C:\Program Files\Java\jdk-11\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2019.1.1\lib\idea_rt.jar=54045:D:\IntelliJ IDEA 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\studyhard\out\production\studyhard Main
Start.
生成了一个实例.
obj1与obj2是相同的实例.
End.

Process finished with exit code 0

Singleton模式中的登场是角色
在Singleton模式中有以下登场角色
Singleton
在Singleton模式中,只有Singleton这一个角色.Singleton角色中有一个返回唯一实例的static方法.该方法总是会返回同一个实例
Singleton模式的类图
在这里插入图片描述

为什么必须设置限制
Singleton模式对实例的数量设置了限制.为什么要在程序中特意设置这个限制呢?设置限制其实就是为程序增加一项前提条件.
当存在多个实例时,实例之间相互影响,可能会产生意想不到的Bug.
但是,如果我们可以确保只有一个实例,就可以在这个前提条件下放心地编程了.
何时生成这个唯一实例
稍微注意一下实例程序的运行结果就会发现,在"Start.“之后就显示出了"生成了一个实例”.
程序运行后,在第一次调用getInstance方法时,Singleton类会被初始化.也就是在这个时候,static字段Singleton被初始化,生成了唯一的一个实例.

相关的设计模式
在以下模式中,多数情况下只会生成一个实例
AbstractFactory模式
Builder模式
Facade模式
Prototype模式

本章知识
我们学习了确保只能生成一个实例的Singleton模式.我们在Singleton模式中定义了用于获取唯一一个实例的static方法,同时,为了防止不小心使用new关键字创建实例,还将构造函数设置为private

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值