单例模式---设计模式(一)

dolphinscheduler服务注册中心源码解析(一)服务注册与发现整体设计 下一篇文章我们开始讲解dolphinscheduler基于Zookeeper实现注册中心的源码解析。 阅读详情

单例模式:确保一个类最多只有一个实例,并提供一个全局访问点

单例模式类图:
这里写图片描述

类图说明:

首先说明一下该类图中的符号:
类:
使用三层矩形框表示
第一层:显示类的名称,如果是抽象类,则就用斜体显示
第二层:字段和属性
第三层:类的方法

“+”:表示public
“-”:表示private
“#”:表示protected

接口:
使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示
第一层:接口的名称
第二层:接口的方法

继承类(extends):
用空心三角形+直线表示

实现接口(implements):
用空心三角形+虚线表示

关联(Association):
用实线箭头来表示

聚合(Aggregation):
用空心菱形+实线箭头来表示
聚合:表示一种弱的‘拥有’关系,体现的是A对象可以包含B,但B对象不是A对象的一部分,例如:公司和员工

组合(Composition):
用实心菱形+实线箭头来表示
组合:部分和整体的关系,并且生命周期是相同的。例如:人和手

依赖(Dependency):
用虚线箭头来表示
例如:动物和氧气

单例模式

Singleton类称为单例类,通过使用private的构造函数,确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。
单例模式的通用代码:
饿汉式:

package singletontest;

/**
 * 单例模式(饿汉模式)
 * 应用场合:有些对象只需要一个就足够了,如古代皇帝,老婆
 * 作用:保证整个应用程序中某个实例有且只有一个
 * 类型:懒汉模式,饿汉模式
 * @author 张耀晖
 *
 */
public class Singleton {
    //1.将构造方法私有化,不允许外部直接创建对象
    private Singleton(){

    }
    //2.创建类的唯一实例,使用private static修饰
    private static Singleton singleton = new Singleton();

    //3.提供一个用于获取实例的方法,使用public static修饰
    public static Singleton getInstance(){
        return singleton;
    }


}

懒汉式:

package singletontest;

/**
 * 懒汉模式
 * 区别:饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
 *     懒汉模式特点是加载类时比较快,但运行时获取对象速度比较慢,线程不安全
 * @author 张耀晖
 *
 */
public class Singleton2 {
    //1.将构造方法私有化,不允许外边直接创建对象
    private Singleton2(){

    }
    //2.声明类的唯一实例,使用private static修饰
    private static Singleton2 singleton2;
    //3.提供一个用于获取实例的方法,使用public static修饰
    public static Singleton2 getInstance(){
        if(singleton2==null){
            singleton2 = new Singleton2();
        }
        return singleton2;
    }

}
package singletontest;

public class Test {
    public static void main(String[] args) {
        //饿汉模式
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        if(s1==s2){
            System.out.println("s1和s2是同一个实例");
        }else{
            System.out.println("s1和s2不是同一个实例");
        }

        //懒汉模式
        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        if(s3==s4){
            System.out.println("s3和s4是同一个实例");
        }else{
            System.out.println("s3和s4不是同一个实例");
        }
    }

}

运行结果:
这里写图片描述

注意:
懒汉式是存在线程不安全问题的。
懒汉式在低并发的情况下有可能不会出现问题,但是当高并发的情况下则可能在内存中出现多个实例。
eg:如果一个线程A执行到singleton2 = new Singleton2(),但还没有获得对象(对象初始化是需要时间的),第二个线程B也在执行,执行到singleton2==null的判断,那么线程B获得判断条件也是为真,于是继续运行下去,线程A获得一个对象,线程B也获得一个对象,在内存中就出现了两个对象。

解决懒汉式的线程不安全问题的方法:
在getInstance()方法前加synchronized关键字。不过这样的话只适应调用实例对象少的情况,如果调用实例对象比较频繁synchronized就会影响系统的执行效率。那么就建议使用饿汉式。
饿汉式也有一定的问题,在不使用类的实例对象的时候也会创建该类的实例对象,造成一定的资源浪费。

  1. 单例模式的优点
    •由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的被创建、销毁,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显;
    •由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVM垃圾回收机制);
    •单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
    •单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

  2. 单例模式的缺点
    •单例模式没有接口,扩展很困难,若要扩展,除了修改代码没有第二种途径可以实现。单例模式为什么不能增加接口呢?因为接口对单例模式是没有任何的意义,它要求“自行实例化”,并且提供单一实例、接口或抽象类是不可能被实例化的。
    •单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象。
    •单例模式与单一职责原则有冲突。一个类应该只实现一个的逻辑,而不关心它是否是单例的,决定它是不是要单例是环境决定的,单例模式把“要单例”和业务逻辑融合也在一个类中。

  3. 单例模式的使用场景

    在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”时,则可以采用单例模式,具体的场景如下:
    •要求生成唯一序列号的环境;
    •在整个项目中需要有访问一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
    •创建一个对象需要消耗的资源过多,如要访问IO、访问数据库等资源;
    •需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式);

单例模式的扩展

现在有一个问题:如果要求一个类只能产生固定数量(大于1个)的对象怎么办?

package com.test.singletonTest;

import java.util.ArrayList;
import java.util.Random;

/**
 * 单例模式的扩展,产生固定数量的(大于1个)的实例对象
 * 2015年9月17日 下午5:08:15
 * @author 张耀晖
 *
 */
public class SingletonTest {

    private static int maxnum = 3;//定义最多能产生的实例对象的数量
    private static ArrayList<SingletonTest> singletonList = new ArrayList<SingletonTest>();//定义一个集合,容纳所有的实例对象
    private static ArrayList<String> singletonNameList = new ArrayList<String>();//定义一个集合,容纳所有对象的私有属性

    //当前实例对象的标号
    private static int countOfNum;

    //产生所有的对象
    static{
        for (int i = 0; i < maxnum; i++) {
            singletonList.add(new SingletonTest("实例对象:"+i+1));
        }
    }

//  //将类中默认的无参构造方法重写为private,防止在外部创建该类的实例对象
//  private SingletonTest(){
//      
//  }

    //传入实例对象的名称,创建实例对象
    private SingletonTest(String name){
        singletonNameList.add(name);
    }

    //随机获得一个实例对象
    public static SingletonTest getInstance(){
        Random random = new Random();
        countOfNum = random.nextInt(maxnum);
        //随机取出一个实例对象
        SingletonTest singletonTest = singletonList.get(countOfNum);
        return singletonTest;
    }

    //获取实例对象的私有属性
    public static String getSingletonName(){
        String name = singletonNameList.get(countOfNum);
        return name;
    }

}
Tesla v100 4张显卡组装机安装vllm和ollama在Ubuntu系统上的安装---AI大模型系统从零开始0032 本文提供Ubuntu22.04系统下vLLM的完整安装指南,适配4×32G Tesla显卡的单机4卡张量并行部署。教程包含:1)硬件要求(Ubuntu22.04、NVIDIA驱动≥535、CUDA12.1+);2)NVIDIA驱动自动安装方法;3)Python3.10虚拟环境配置;4)vLLM官方预编译包一键安装;5)单机4卡启动Qwen3.6-27B模型的完整参数说明(含FP8量化、多进程并行等关键配置)。文末附分布式部署的Ray集群方案参考链接,适用于多机8卡场景。 阅读详情

相关推荐

数字电子时钟——数字电路课设

本文设计了一种基于中小规模集成电路的数字电子时钟系统,采用模块化设计方法,包含晶振电路(CD4060+D触发器)、计时电路(74HC161计数器)、数码管驱动(CD4511)和整点报时功能。系统实现了60进制秒/分、24进制小时、7进制星期的计时显示,支持手动校时功能,并具备整点报时特性(59分54-58秒5次500Hz低音,59秒1次1000Hz高音)。通过分模块调试与整合,最终实物电路满足设计要求,获得优秀评价。

来自FZU——电子科学与技术专业 1489

创建型设计模式——单例模式

单例模式定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例场景,也就是说:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。保证一个类仅有一个实例,并提供一个访问它的全局访问点。

庄小焱 1729

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 827

Java设计模式之创建者模式之单例模式最详解(类图+源码)

Java设计模式之创建者模式之单例模式最详解(类图+源码)

shaAmerica的博客 2614

基于文件通信的QMT量化交易信号桥接方案设计与实现

在量化交易系统开发中,进程间通信(IPC)是连接不同计算模块、实现策略逻辑与交易执行解耦的关键技术。其核心原理在于允许运行于独立环境或进程的程序安全、可靠地交换数据。文件系统通信作为一种经典的IPC方法,因其实现简单、跨平台兼容性好且数据可持久化,在非高频场景下具有重要技术价值。它尤其适用于需要将外部复杂计算环境(如配备丰富数据科学库的Python环境)与专用交易终端(如迅投QMT)集成的应用场景。通过约定文件路径与数据格式,外部程序可将包含交易指令的JSON信号文件写入特定目录,而交易终端通过轮询或监听机

weixin_28678151的博客 419

VLSI数字信号处理系统——第九章滤波器和变换中的算法强度缩减

[课程学习] VLSI数字信号处理系统——第九章滤波器和变换中的算法强度缩减

夏风喃喃的博客 1604

详解设计模式之单例模式

1.单例模式概述 单例设计模式所解决的问题就是:保证类的对象在内存中唯一,即一个类只有一个对象实例 单例模式的结构 单例类。只能创建一个实例的类,对象的创建 访问类。使用单例类,对象的使用 单例模式特点 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例 单例模式的优缺点 优点: 在内存中只有一个对象,节省内存空间; 避免频繁的创建销毁对象,可以提高性能; 避免对共享资源的多重占用,简化访问; 为整个系统提供一个全局访问点。 缺点:

q2511130633的博客 2569

Unity雷达图效果实现

unity雷达图源码

a604263644的博客 1026

1、设计模式之“单例模式”

     第一章节:单例模式 文章目录1、我是皇帝我独苗2、单例模式的定义3、 单例模式的应用            3.1 单例模式的优点            3.2 单例模式的缺点   &nbsp

weixin_44001753的博客 1516

【Python图像处理局部放大】输入图像,选择两处不同的区域进行放大操作,然后将原始图像、处理后的两个区域以及标记合成新图像进行展示

Python图像处理与区域放大连接标记:选择特定区域并对其进行放大操作,然后将原始图像、处理后的两个区域进行标记后的新图像保存到文件中。

qq_35831906的博客 2243

【MATLAB】嵌入式ADC/DAC控制工程

摘要:本文针对嵌入式ADC/DAC应用中存在的量化误差、采样噪声、输出漂移等问题,提出基于MATLAB的仿真优化方案。通过构建完整的ADC/DAC仿真模型,实现了采样建模、数字滤波、误差校准和闭环控制仿真。方案采用滑动平均滤波抑制ADC噪声,双校准参数补偿DAC固有误差,并将算法轻量化移植至STM32平台。实测表明,该方案使ADC采样波动从±25mV降至±5mV,DAC输出偏差从42mV降至18mV,显著提升了模拟量交互精度和系统稳定性。整套方案资源占用低,适配各类嵌入式高精度控制场景,具有较高的工程应用价

unber的博客 650

私有静态成员理解(C++)

先上代码,运行分析结合注释说明,自然会明白,后面给出总结 #include <iostream> class A { public: A() {} ~A() {} public: //公有静态成员函数 static void setA1(int val) { A...

FBeetle的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

设计模式(一)单例模式 Singleton pattern

对于我而言设计模式

v_fangfang_v的专栏 493

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式(一):单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是设计模式中常用的一种,知识点包括:1、理解什么是单例模式、单例模式有什么优点/缺点、单例模式的应用场景;2、再来看看Java单例模式的6种代码实现方式、每种实现方式有什么需要注意的;3、后面再来了解Java单例模式其他值得关注的地方,如比较静态方法、以及Java反射、反序列化、垃圾回收的影响等。

tjiyu的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式一:单例模式(Singleton Pattern)

目录 相关视频: 相关文章: 相关面试题: 一、概述: 二、理解: 三、所有单例模式 (1)、饿汉式: 代码实例: 特点: 不足: (2)、懒汉式: (3)、双重校验锁DCL(double checked locking) (4)、静态内部类实现(最推荐) (5)、枚举单例 四、Android中的单例 相关视频: Java设计模式之单例模式视频课程 模式的秘密...

songzi1228的博客 509

设计模式一之单例模式

单例模式的八种写法比较   单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到饿汉式和懒汉式这两种实现方式。但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧。 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我...

hhj13978064496的博客 195

一、设计模式之单例模式

单例模式就是采取一定方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法步骤如下:(1)构造器私有化 =>防止直接new(2)类的内部创建对象(3)向外暴露一个静态的公共方法,getInstance。

m0_64281374的博客 1040

【设计模式】一:单例模式

单例模式可以说是最简单的设计模式之一,但是要真正理解单例模式也不是想象的那么简单的,本文以简洁明了的方式带大家深入浅出的分析单例模式。

ai15013602354的博客 775

java设计模式一、单例模式

单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。简单来说,就是“只创建一个对象,或者每次使用的对象都是同一个对象”。这种模式在许多场景下非常有用,比如配置信息管理、线程池、数据库连接池、日志对象等,这些情况下我们需要确保全局只有一个实例存在,以避免资源浪费或状态不一致的问题。单例模式是设计模式中最简单但也是最常被问到的模式之一。正确实现单例模式需要考虑线程安全、懒加载、序列化等问题。

2301_79028279的博客 1504

设计模式《一》——单例模式

简介 单例对象(Singleton)是一种常用的设计模式。其保障一个类只有单个对象被创建,在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个...

草根工厂——技术虐我千百遍,我依然待你如初恋 185

深入浅出设计模式【一、单例模式】

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它适用于控制资源访问、管理全局状态等场景,但不适用于有状态对象或需要频繁测试的情况。常见实现方式有:饿汉式(简单但可能浪费资源)、懒汉式(延迟加载但需考虑线程安全)、双重校验锁(性能较高)、静态内部类(推荐方式)和枚举(最简洁安全)。不同实现方式在线程安全、性能和复杂度上各有优劣,需根据具体场景选择。

NeoLshu的博客 1218

设计模式系列(一)单例模式

一、简单介绍 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。 《设计模式》书中对单例模式动机的介绍 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Win

robert的专栏 7023

菜鸟学习设计模式①单例模式

单例模式 一、何为设计模式 在软件开发过程中,总会遇到各种各样的问题,而设计模式就是众多开发者在实践中总结出来的解决一般性问题的方案。 设计模式可分为三大类,分别是创新型模式(creational)、结构型模式(structural)和行为型模式(behavioral) 二、单例模式 **描述:**单例模式属于创建型模式,是java中最简单的设计模式之一。在创建单例类时,同时创建自己的对象,再提供访问此对象的唯一方式。使用此对象时,可以直接访问,不需要实例化。保证一个类仅有一个实例,并提供一个访问它的全局访

as_lover的博客 465

单例模式——C#设计模式一

原文地址:点击打开链接 原文作者:Learning hard 原文出处:博客园 一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同 时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因...

U3D开发 236

当Kotlin邂逅设计模式之单例模式(一)

简述: 从这篇文章开始,我将带领大家一起来探讨一下Kotlin眼中的设计模式。说下为什么想着要开始这么一个系列文章。主要基于下面几点原因: 说下最终的目标吧,最终目标是有基础能力在分析的源码时候能够站在一个全局角度去思考,而不是一头扎入茫茫源码中无法自拔迷失自我。后面也会随即出一些有关源码分析的文章。所以请暂时先好好掌握这些基础的工具。 一、介绍 单例模式是开发者最为常见的一种设计...

Kotlin中文社区 617

设计模式(一)单例模式

单例模式的实现方式详解 饿汉模式:特点:类加载到内存后,就实例化出一个单例,JVM保证线程安全;缺点:不论用于不用,类加载时都会进行实例化; 静态变量: public class Single { private static final Single INSTANCE = new Single(); //构造方法私有化 private Single() { } public static Single getInstance() { re.

yanf_cmon的博客 2827
上一篇: Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)
下一篇: 工厂模式---设计模式(二)
大海深处的星星
博客等级 码龄13年 266粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值