单例模式介绍

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

动机

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

相关推荐
tanyongxi661 小时前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
the sun342 天前
常见的设计模式(2)单例模式
单例模式·设计模式
Tina学编程2 天前
线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉
java·单例模式·线程安全
我们从未走散2 天前
设计模式学习笔记-----单例模式
java·笔记·学习·单例模式·设计模式
安然~~~4 天前
单例模式的理解
java·单例模式
板鸭〈小号〉8 天前
线程安全的单例模式,STL和智能指针
开发语言·c++·单例模式
Runing_WoNiu8 天前
Golang 与Java 单例模式、工厂模式比较
java·单例模式·golang
源代码•宸17 天前
深入浅出设计模式——创建型模式之单例模式 Singleton
开发语言·c++·经验分享·单例模式·设计模式
Y第五个季节17 天前
设计模式:单例模式
单例模式
小钻风336618 天前
设计模式之单例模式及其在多线程下的使用
单例模式·设计模式