单例模式介绍

单例模式用于创建那些在软件系统中独一无二的对象,是一个简单但很实用的设计模式。

动机

对于一个软件系统中的某些类而言,无须创建多个实例。举个大家都熟知的例子------Windows任务管理器,可以做一个这样的尝试:在Windows任务栏的右键弹出菜单上多次单击"启动任务管理器"​,看能否打开多个任务管理器窗口(注:计算机中毒或私自修改Windows内核者除外)​。在正常情况下,无论启动任务管理器多少次,Windows系统始终只能弹出一个任务管理器窗口,也就是说,在一个Windows系统中,任务管理器存在唯一性。

下面来模拟实现Windows任务管理器。假设任务管理器的类名为TaskManager,在TaskManager类中包含了大量的成员方法,例如构造函数TaskManager(​)​,显示进程的方法displayProcesses(​)​,显示服务的方法displayServices(​)等,该类的示意代码如下:

为了实现Windows任务管理器的唯一性,通过以下3步对TaskManager类进行重构:(1)由于每次使用new关键字来实例化TaskManager类时都将产生一个新对象,为了确保TaskManager实例的唯一性,需要禁止类的外部直接使用new来创建对象,因此需要将TaskManager的构造函数的可见性改为private,代码如下:

复制代码
private TaskManager(){..}

(2)将构造函数的可见性改为private后,虽然类的外部不能再使用new来创建对象,但是在TaskManager的内部还是可以创建对象的,可见性只对类外有效。因此,可以在TaskManager中创建并保存这个唯一实例。为了让外界可以访问这个唯一实例,需要在TaskManager中定义一个静态的TaskManager类型的私有成员变量,代码

复制代码
private static TaskManager tm = null;

(3)为了保证成员变量的封装性,将TaskManager类型的tm对象的可见性设置为private,但外界该如何使用该成员变量并何时实例化该成员变量呢?答案是增加一个公有的静态方法,代码如下:

复制代码
public static TaskManager getInstance() {
	if (tm == null) {
	tm = new TaskManager();/ /自行实例化
	}
	return tm;
}

在getInstance(​)方法中首先判断tm对象是否存在,如果不存在(即tm==null为true)​,则使用new关键字创建一个新的TaskManager类型的tm对象,再返回新创建的tm对象;否则直接返回已有的tm对象。

需要注意的是getInstance(​)方法的修饰符,首先它应该是一个public方法,以便外界其他对象使用;其次它使用了static关键字,即它是一个静态方法,在类外可以直接通过类名来访问,而无须创建TaskManager对象。事实上,在类外也无法创建TaskManager对象,因为构造函数是私有的。

完整代码:

单例模式(Singleton Pattern)​:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。单例模式有3个要点:①某个类只能有一个实例;②它必须自行创建这个实例;③它必须自行向整个系统提供这个实例。单例模式是结构最简单的设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。

相关推荐
罗超驿2 天前
10.Java单例模式全解析:饿汉式与懒汉式实现及线程安全深度剖析
安全·单例模式·javaee
布朗克1682 天前
33 设计模式精讲
java·单例模式·设计模式
雨浓YN3 天前
基于设计模式的Winform软件框架-01Xml\Log\Ini日志(单例模式+生产者消费者模式)
单例模式·设计模式
仙俊红3 天前
Java 单例模式:类里面为什么可以有自己类型的字段?
java·开发语言·单例模式
swordbob4 天前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
谁似人间西林客5 天前
工业大数据实战:看中国智造如何用数据驱动效率革命
大数据·单例模式
张小姐的猫5 天前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
Java面试题总结7 天前
双重检验锁的单例模式在高并发下的可见性问题
单例模式
珊瑚里的鱼9 天前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
韩曙亮9 天前
【Flutter】Dart 单例 ( 单例模式核心规则 | 饿汉式单例 | 懒汉式单例 | 极简空安全 懒汉式单例 | 工厂构造函数单例 )
flutter·单例模式·dart·饿汉式单例·懒汉式单例·空安全·空赋值