「设计模式」- 教你手写单例模式

手写一个单例模式 (考虑线程安全)。 在软件开发中,有些场景下我们希望某个类永远只创建一个实例。系统的配置管理器:如果有多个配置实例,可能导致配置不一致日志记录器:多个日志实例可能导致日志文件被重复写入数据库连接池:过多连接池实例会浪费资源单例模式(Singleton Pattern)就是为解决这类问题而生的设计模式。确保一个类只有一个实例,并提供一个全局访问点。但在多线程环境下,简单的单例实现可能会"失效"。 阅读详情

前言

单例模式(Singleton pattern):确保一个类只有一个实例,并提供该实例的全局访问点

本文主要分析单例模式常见的几种实现方式

一. 类图

单例模式使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。

私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。

二. 实现方式

2.1 饿汉式

饿汉式在类加载的时候就进行实例化,这样做的好处是线程安全;但缺点也是有的,首先在加载的时候就进行实例化,万一这个类占用的资源很大,就会非常浪费资源,毕竟它不一定在什么时候被使用,但内存是一开始就被占用了。

public class HungryManSingleton {
    private static HungryManSingleton hungryManSingleton = new HungryManSingleton();

    private HungryManSingleton() { }
    
    public static HungryManSingleton getInstance() {
        return hungryManSingleton;
    }
} 
复制代码

在main方法中验证饿汉式实现的单例模式:

HungryManSingleton instance1 = HungryManSingleton.getInstance();
HungryManSingleton instance2 =
手把手教你手写单例,六种实现方式一网打尽! 单例模式(Singleton Pattern)的核心思想就是“一个类只有一个实例,并且自行向整个系统提供这个实例。”这个实例一般是通过该类自己创建的。单例模式的特点:确保某个类只有一个实例。提供一个全局访问点来访问这个实例。使用场景:需要频繁实例化和销毁的对象。比如:多线程的线程池、数据库连接池。耗费资源过多的对象。比如:文件管理器、日志处理器。工具类对象。比如:配置文件读取类、全局配置管理类。全局状态类。比如:系统中状态信息的管理类。 阅读详情

相关推荐

【设计模式】用Java手写21种常见设计模式

文章目录十二、行为1——模板方法模式十三、行为2——迭代器模式 配套使用效果更佳: 本博客配套开源源码github点击跳转 在《25种常见设计模式思想(上)》中我介绍了4种创建型设计模式和7种结构型设计模式,在此博客中我将继续介绍剩下的x种行为类设计模式。以下是本篇博客的思维导图: 十二、行为1——模板方法模式 模板方法模式非常类似于定制表格,设计者先将所有需要填写的信息头(字段名)抽取出来,再将它们整合在一起成为一种既定格式的表格,最后让填表人按照这个标准化模板去填写自己特有的信息,而不必为书写内容、先

TracyCoder的博客 5075

2025 年 Java 面试高频手写代码题(附核心实现)

‌题型‌‌核心知识点‌单例模式双重校验锁、枚举实现、静态内部类‌多线程同步wait/notify 机制、锁优化、阻塞队列‌数据结构操作链表反转、二叉树遍历(前/中/后序)、哈希表扩展‌算法实现快排/归并排序、二分查找、动态规划(背包问题)‌工程问题红包算法、字符串处理、LRU 缓存设计‌建议‌:面试前重点练习单例模式、多线程交替打印、链表操作和排序算法,结合代码手写训练与原理分析,确保能清晰解释实现细节和优化思路‌。

Super_King_的博客 1042

【Python面试题】-设计模式

单例 1.1 请手写一个单例 1.class A(object): 2.instance = None 3.def new (cls, *args, **kwargs): 4.if cls. instance is None: 5.cls. instance = object. new (cls) 6.return cls. instance 7.else: 8.return cls. instance 1.2 单例模式的应用场景...

学习服务 1021

设计模式常见面试真题详解

大厂常见设计模式题目详解

Redemption___的博客 1052

2024AndroidBATJ面试题设计模式&算法专题总结

接口通常被用来表示附属描述或行为如:Runnable、Clonable、Serializable 等等,因此当你使用抽象类来表示行为时,你的类就不能同时是 Runnable 和 Clonable(注:这里的意思是指如果把 Runnable 等实现为抽象类的情况),因为在 Java 中你不能继承两个类,但当你使用接口时,你的类就可以同时拥有多个不同的行为。如果你看到一个类的不同实现有着不同的方式来做同一件事,那么就应该用重写(overriding),而重载(overloading)是用不同的输入做同一件事。

2401_89190875的博客 706

C#实战解析:工厂模式、代理模式、单例模式的核心逻辑与坑点

设计模式是软件工程中解决特定问题的经典范式,其中创建型与结构型模式是理解框架源码和构建高可维护系统的基石。单例模式通过严格控制实例数量,保证全局状态一致性;工厂模式将对象创建过程与使用方解耦,提升扩展弹性;代理模式则在不侵入原对象的基础上,实现对访问的控制与增强。这些模式广泛存在于企业级应用、中间件及常用框架中,但若不了解其适用边界与线程安全、反射破坏、性能开销等关键细节,容易陷入“会用但用不好”的困境。掌握它们的核心原理与工程实践中的取舍,能够显著提升代码的健壮性与可读性。本文以C#代码示例切入,剖析这三

weixin_29306317的博客 256

2019AndroidBATJ面试题设计模式&算法专题总结

10.给阿里2万多名员工按年龄排序应该选择哪个算法? 11.GC算法(各种算法的优缺点以及应用场景) 12.蚁群算法与蒙特卡洛算法 13.子串包含问题(KMP 算法)写代码实现 14.一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法 15.万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化) 16.百度POI中如何试下查找最近的商家功能(提示:坐标镜

m0_64314318的博客 209

设计模式---第一篇

点击跳转到网站答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。优点:不会频繁地创建和销毁对象,浪费系统资源。可能这会需要你手写一个单例模式,这就得自己去学了,因为单例模式有很多种写法,懒汉模式,饿汉模式,双重检查模式等。懒汉模式就是用的时候再去创建对象,饿汉模式就是提前就已经加载好的静态static对象,双重检查模式就是两次检查避免多线程造成创建了多个对象。

pleaseprintf的博客 952

【Java面试题汇总】设计模式篇(2026版)

谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式

种一棵树最好的时间是十年前,其次是现在 8924

设计模式(二十四)——手写Spring IOC容器

Spring大约有20个模块,由1300多个不同的文件构成。这些模块可以分为: 核心容器、AOP和设备支持、数据访问与集成、Web组件、通信报文和集成测试等

壹升茉莉清的博客 472

划重点:面试中单例模式的考点!(C++版本)

在Jungle的上一篇文章《设计模式那么多!面试官会怎么问》中,总结了在面试过程中经常考察的设计模式及相关考点。文中提到,单例模式几乎是必考点。这并不是危言耸听或者夸大其词。面试中“设计模式三剑客”(单例模式、工厂模式和观察者模式)里单例模式首当其冲!(用词不当?)设计模式那么多!面试官会怎么问?https://blog.youkuaiyun.com/sinat_21107433/article/details/120557373 1. 单例模式的概念 单例模式: 确保一个类只有一个实例,并提供一个全局访问点.

冯Jungle的个人博客 1794

Go 学习笔记(90)— 常用设计模式(单例模式、工厂模式、策略模式、模板模式、代理模式、选项模式)

从总体上说,设计模式可以分为创建型模式、结构型模式、行为型模式 3 大类,用来完成不同的场景。其中分类如下: 1. 创建型模式 它提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这种类型的设计模式里,单例模式和工厂模式(具体包括简单工厂模式、抽象工厂模式和工厂方法模式三种)在 Go 项目开发中比较常用。 1.1 单例模式 单例模式,是最简单的一个模式。在 Go 中,单例模式指的是全局只有一个实例,并且它负责创建自己的对象。单例模式不仅有利于减少内存开支,还有减少系统

wohu1104的专栏 1168

python3面试题23个(设计模式、面向对象、正则)

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。

数据知道的博客 1万+

【第八章:设计模式】第29节:面试常考设计模式(下)

大家好,本小节中我们继续交流学习常见的设计模式。在上一小节中,我们介绍了设计模式的六大原则,并且重点阐述了单例模式的多种写法。单例模式也是为数不多的可以在面试中直接“手撕”的设计模式。除了单例模式外,在面试中考察的其余常见设计模式一般都不会要求我们手写代码。 所以,我们可以重点掌握常见设计模式的思想,在面试中可以较为清晰的阐述该种设计模式主要是在干什么,需要怎么干即可。好了,让我们来看下面试中常见的设计模式吧~ (1)工厂方法模式: 工厂方法模式是一种常见的设计模式。工厂方法模式定义了一个用于创建对象的.

冷血之心的博客 638

DJI MobileSDK运行实例代码教程(保姆级)坑踩完了

其中比较重要的是PackageName也就是我们应用的包名,在这里我们可以直接使用官方文档中的包名,com.dji.ImportSDKDemo,appname为:ImportSDKDemo,其他的可以随意。在C盘中根据路径先找到 “用户/admin/.gradle”下的.gradle文件夹,然后依次打开wrapper/dists文件夹,找到我们刚刚要下载的gradle版本名的文件夹。在Androidstudio中打开,选在打开项目选择文件下载后的保存路径(解压之后的),在打开项目后会自动下载gradle。

k1121568的博客 2862

RTX 50系显卡(5080/5090D)CUDA 12.8环境下的vLLM部署避坑与实战指南

本文为RTX 5080/5090D显卡用户提供了在CUDA 12.8环境下部署vLLM的完整实战指南。文章详细介绍了从驱动安装、CUDA 12.8环境配置、PyTorch Nightly版本精准匹配,到vLLM源码编译及常见报错排查的全过程,帮助开发者高效利用新一代硬件进行大模型推理。

gray5的博客 663

如何在windows下使用cmake编译源码

MyProject/└── build/在MyProject目录下创建并编辑。创建build目录并进入。使用cmake命令生成构建文件。使用适当的命令编译项目。运行生成的可执行文件。

cdj444asdg的博客 3345

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4592

从机械臂示教到厨房做饭:ACT模仿学习如何让机器人更“人性化”?

本文探讨了ACT(Action Chunking with Transformers)模仿学习技术如何让机器人更“人性化”,特别是在厨房等复杂场景中的应用。通过动作分块(Action Chunking)和时态融合(Temporal Ensemble)技术,机器人能够像人类一样记忆和执行复杂任务,如烹饪。文章还分析了ACT在家庭场景中的落地挑战及其在康复医疗、柔性制造等领域的跨领域应用潜力。

weixin_30613343的博客 255

Fastjson2 2.0.26反序列化漏洞深度剖析:从原理到PoC构造

本文深度剖析了Fastjson2在2.0.26及之前版本中存在的反序列化漏洞。该漏洞允许攻击者通过构造包含恶意TemplatesImpl对象的JSONArray,并利用BadAttributeValueExpException触发,在反序列化过程中实现远程代码执行。文章从漏洞原理、PoC构造、利用链分析到防御建议,提供了全面的技术解读,帮助开发者和安全人员理解其危害并采取应对措施。

d3e4f的博客 1050

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2809

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 296

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 「JVM 系列」- JVM的类加载机制
下一篇: Servlet的起源以及Servlet到底是什么
普通网友
博客等级 码龄5年 3419粉丝 477原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值