欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 单例模式介绍

单例模式介绍

2025/3/21 19:15:25 来源:https://blog.csdn.net/weixin_42692164/article/details/146401046  浏览:    关键词:单例模式介绍

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

动机

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

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词