设计模式之单例模式解析

news2024/11/17 21:25:19
单例模式
1)动机

对于软件系统的某些类,无须创建多个实例,如 Windows 系统的任务管理器,重复对象会浪费系统资源。

2)概述
1.定义

确保某个类只有一个实例,而且自行实例化,并向整个系统提供这个实例,提供全局访问的方法。

在这里插入图片描述

2.角色

Singleton(单例)

在单例类的内部只生成一个实例,并提供一个静态的 getInstance() 工厂方法,让客户可以访问它的唯一实例;

为防止在外部对其实例化,将其构造函数设为私有;

在单例类内部定义了一个 Singleton 类型的静态对象,作为外部共享的唯一实例。

3)案例-简单单例模式

实现 Windows 任务管理器,类名为TaskManager,包含构造函数TaskManager(),显示进程的方法displayProcesses(),显示服务的方法displayServices();

class TaskManager
{
		 // 私有成员变量
     private static TaskManager tm = null;
     
     // 私有构造方法
     private TaskManager() {……} //初始化窗口
     
     // 成员方法
     public void  displayProcesses() {……} //显示进程
     public void  displayServices() {……} //显示服务
     
     // 工厂方法
     public static TaskManager getInstance()
     {
        if (tm == null)
        {
            tm = new TaskManager();
        }
        return tm;
    }
   ……
}
4)案例-饿汉式单例和懒汉式单例
1.饿汉式单例

定义静态变量时实例化单例类,当类被加载时,静态变量 instance 被初始化,此时类的私有构造函数会被调用,单例类的唯一实例将被创建。

在这里插入图片描述

class EagerSingleton { 
    private static final EagerSingleton instance = new EagerSingleton(); 
    private EagerSingleton() { } 
 
    public static EagerSingleton getInstance() {
        return instance; 
    }   
}
2.懒汉式单例

第一次调用 getInstance() 时实例化,在类加载时并不自行实例化,为避免多个线程同时调用 getInstance(),使用 synchronized。

在这里插入图片描述

class LazySingleton { 
    private static LazySingleton instance = null; 
    private LazySingleton() { } 
 
    synchronized public static LazySingleton getInstance() { 
        if (instance == null) {
            instance = new LazySingleton(); 
        }
        return instance; 
    }
}

问题

在 getInstance() 增加关键字 synchronized,以处理多个线程同时访问的问题,但是每次调用 getInstance( ) 时都进行线程锁定判断,在多线程高并发环境中,会导致系统性能大大降低。

方案

减小锁范围+双重检查锁定(Double-Check Locking);

class LazySingleton { 
		// 原子性 volatile
    private volatile static LazySingleton instance = null; 
 
    private LazySingleton() { } 
 
    public static LazySingleton getInstance() { 
        //第一重判断
        if (instance == null) {
            //锁定代码块
            synchronized (LazySingleton.class) {
                //第二重判断
                if (instance == null) {
                    instance = new LazySingleton(); //创建单例实例
                }
            }
        }
        return instance; 
    }
}
3.饿汉式单例类与懒汉式单例类对比
分类类加载时机资源利用复杂度
饿汉式单例类类加载时
懒汉式单例类第一次使用时
5)案例-Initialization Demand Holder (IoDH) 实现单例类

在单例类中增加一个静态(static)内部类,在该内部类中创建单例对象,再将该单例对象通过 getInstance() 返回给外部使用。

class Singleton {
	private Singleton() {
	}
	
	private static class HolderClass {
       private final static Singleton instance = new Singleton();
	}
	
	public static Singleton getInstance() {
	    return HolderClass.instance;
	}
}

使用 IoDH,可以实现延迟加载,保证线程安全,不影响系统性能。

6)总结
1.优点

单例模式可以严格控制怎样以及何时访问。

在内存中只存在一个对象,可以节约系统资源,对于需要频繁创建和销毁的对象,单例模式可以提高系统性能。

允许可变数目的实例,使用与单例控制相似的方法来获得指定个数的对象实例。

2.缺点

因为单例模式中没有抽象层,所以单例类的扩展很困难;

单例类的职责过重;

如果实例化的共享对象长时间不被利用,会自动销毁并回收资源,下次利用时又将重新实例化,会导致共享的单例对象状态丢失。

3.适用场景

系统只需要一个实例对象,或者因资源消耗太大而只允许创建一个对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Kotlin(六)协程的并发问题

书接上回:Android Kotlin知识汇总(三)Kotlin 协程 协程的并发问题 在一个协程中,循环创建10个子协程且单独运行各自Default线程中,并让每个子协程对变量 i 进行1000次自增操作。示例如下: fun main() …

Jupyter服务器端为R语言安装readr包

1.登录debian服务器 方式1.Windows10中可利用putty登录linux服务器 方式2.自从搭建了Jupyter服务器后,还可以从juypyter的终端来登录linux服务器 2.进入R语言命令行 3.安装readr包 >install.packages(‘readr’) …

使用CSS3画出一个叮当猫HTML源码

我们经常使用PS或者Flash制作动画&#xff0c;本文则介绍了如何用CSS3画出个叮当猫&#xff0c;实现过程很有趣&#xff0c;感兴趣的朋友可以参考一下 首先&#xff0c;先把HTML结构搭建好&#xff1a; <div class"wrapper"> <!--叮当猫整体--> <di…

DP动态规划入门(数字三角形、破损的楼梯、安全序列)

一、动态规划&#xff08;DP&#xff09;简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是运筹学的一个分支&#xff0c;它是一种通过将复杂问题分解成多个重叠的子问题&#xff0c;并通过子问题的解来构建整个问题的解的算法。在动态规划中&am…

2016年认证杯SPSSPRO杯数学建模D题(第一阶段)NBA是否有必要设立四分线解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现 NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力挽狂澜的&am…

.NET Core 服务实现监控可观测性最佳实践

前言 本次实践主要是介绍 .Net Core 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境&#xff1a;Kubernetes编程语言&#xff1a;.NET Core ≥ 2.1日志框架&#xff1a;Serilog探针类型&#xff1a;ddtrace 接入方案 准备工作 DataKit 部署 DataK…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言&#xff1a; 随着互联网的普及&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都需要通过网络来进行各种操作。然而&#xff0c;网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络&#xff0c;我们…

V2X技术与智能传感器的完美融合:提升城市道路安全

在科技不断创新的今天&#xff0c;城市交通领域涌现了大量新技术。有时候我们不仅仅需要独立应用这些新技术来实现交通的变革&#xff0c;更需要将它们巧妙地结合连接起来&#xff0c;以获取更高效更安全的交通环境。本文将探讨V2X技术与智能传感器的结合&#xff0c;如何在城市…

如何使用 Elasticsearch 作为向量数据库

在今天的文章中&#xff0c;我们将很快地通过 Docker 来快速地设置 Elasticsearch 及 Kibana&#xff0c;并设置 Elasticsearch 为向量搜索。 拉取 Docker 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2 docker pull docker.elastic.co/kibana/kiba…

python网络相册设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安…

平衡隐私与效率,Partisia Blockchain 解锁数字安全新时代

原文&#xff1a;https://cointelegraph.com/news/exploring-multiparty-computations-role-in-the-future-of-blockchain-privacy&#xff1b; https://medium.com/partisia-blockchain/unlocking-tomorrow-outlook-for-mpc-in-2024-and-beyond-cb170e3ec567 编译&#xff1…

学习笔记Day14:Linux下软件安装

软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器&#xff0c;类似应用商店 Conda < Miniconda < Anaconda&#xff08;有交互界面&#xff09; Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站&#xff…

网络安全笔记-day6,NTFS安全权限

文章目录 NTFS安全权限常用文件系统文件安全权限打开文件安全属性修改文件安全权限1.取消父项继承权限2.添加用户访问权限3.修改用户权限4.验证文件权限5.总结权限 强制继承父项权限文件复制移动权限影响跨分区同分区 总结1.权限累加2.管理员最高权限2.管理员最高权限 NTFS安全…

利用CSS3实现正在加载效果

一、代码区域 1.1css3代码 <style>* {padding: 0;margin: 0;list-style: none;}.loading {width: 300px;height: 100px;margin: 100px auto;}.loading ul {height: 100px;width: 65px;margin: 0 auto;display: flex;align-items: center;}.loading ul li {margin: 0 5p…

么样才能用最便捷的方式为Mac提速呢?

Mac是现代人日常工作时必不可少的工具&#xff0c;尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要&#xff0c;所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。 但是影响Mac的运行和响应速…

Android - 深入浅出理解SeLinux

1. 概述 官方文档&#xff1a; https://source.android.com/docs/security/features/selinux https://source.android.com/docs/security/features/selinux/images/SELinux_Treble.pdf Your visual how-to guide for SELinux policy enforcement | Opensource.com SeLinux&…

计网--网络层个人笔记

网络层的IP分组由路由器转发&#xff0c;而每一个路由器有很多接口&#xff0c;那么从哪一个接口转发便需要转发表。 一、网络层基本功能 二、SDN基本概念 2.1 路由器 数据平面&#xff1a;转发的过程。一个分组如何从一个端口到达另一个端口。 控制平面&#xff1a;路由选择…

小程序渲染层图标错误

小程序渲染图标层出现错误&#xff1a; 官方提示&#xff1a;不影响可以忽略&#xff1b; 通过阿里巴巴矢量图标库--项目设置--字体格式--选中base64格式&#xff1b; 重新更新图标库代码&#xff0c;替换项目中的图标库&#xff1b; 重新加载小程序--渲染层错误的提示消失&…

基于vue+element+springboot+uniapp开发的智慧城管源码,java智慧城市管理综合执法系统源码

智慧城管源码&#xff0c;智慧执法&#xff0c;数字化城市管理综合执法系统源码 智慧城管系统充分利用物联网、云计算、信息融合、网络通讯、数据分析与挖掘等技术&#xff0c;对城市管理进行全方位覆盖。它通过建立城市综合管理平台&#xff0c;将城市的信息和管理资源有机结合…