单例模式介绍

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

动机

对于一个软件系统中的某些类而言,无须创建多个实例。举个大家都熟知的例子------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个要点:①某个类只能有一个实例;②它必须自行创建这个实例;③它必须自行向整个系统提供这个实例。单例模式是结构最简单的设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。

相关推荐
小江的记录本15 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展
计算机安禾2 天前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式
basketball6163 天前
C++ 单例模式完全指南:从饿汉式到现代 C++ 的最佳实践
java·c++·单例模式
W.W.H.4 天前
Qt 应用防多开:极简单例方案
开发语言·qt·单例模式·共享内存
++==4 天前
设计模式:单例模式和观察者模式实现方式以及优化
观察者模式·单例模式·设计模式
摇滚侠7 天前
Java 饿汉式 单例模式
java·开发语言·单例模式
游乐码8 天前
Unity坦克案例疑难记录(一)
unity·单例模式
想学会c++10 天前
单例模式笔记总结
c++·笔记·单例模式
是个西兰花11 天前
单列模式和C++中的类型转换
c++·单例模式·设计模式·rtti
nnsix11 天前
设计模式 - 单例模式 笔记
笔记·单例模式·设计模式