單例模式:只有一個對象

目錄

什么是單例模式

能解決什么問題

使用場景

如何實現

__new__ 方法:經典又直接

裝飾器:不改類本身,也能單例

模塊本身就是單例

注意事項

總結


?

????????你有沒有過這樣的困擾:

“為什么我明明只創建了一次數據庫連接,程序卻悄悄多了好幾個?資源占滿了,性能還慢了。”

????????在軟件世界里,有些東西,真的只需要一個就夠了。這就是單例模式的世界。

什么是單例模式

????????單例模式(Singleton Pattern),本質上就是 保證某個類全局只有一個實例,無論你嘗試創建多少次,得到的都是同一個對象。

????????形象一點:想象你家只有一臺冰箱。無論家里多少人去開門、取東西,冰箱都是那一臺,不會莫名其妙多出一個新冰箱。

能解決什么問題

  • 統一管理資源:比如數據庫連接,創建一次就夠,避免重復占用資源
  • 全局狀態共享:日志記錄器、配置文件、緩存對象…每個模塊都能訪問同一個實例
  • 保證程序穩定性:避免多對象操作同一個資源導致混亂

????????簡單說,單例模式讓你的程序有序而高效,就像冰箱里的食物再多,也不會亂成一團。

使用場景

  • 數據庫連接:你不想每次操作都重新連接數據庫
  • 日志系統:程序里每個模塊都能統一寫入日志
  • 配置管理:整個程序共享一個配置對象,方便修改與讀取
  • 緩存對象:統一存儲數據,避免重復計算

????????換句話說,當“唯一性”是關鍵時,單例就登場了

如何實現

__new__ 方法:經典又直接

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancea = Singleton()
b = Singleton()
print(a is b)  # True
  • 核心理念:對象創建之前先檢查“冰箱”是否存在
  • 如果存在,就直接拿來用;不存在,才創建一個

裝飾器:不改類本身,也能單例

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MyClass:passa = MyClass()
b = MyClass()
print(a is b)  # True
  • 想象:裝飾器就像一個“守門員”,保證每個類的“冰箱”只出現一次
  • 優點:無需修改類本身,易復用

模塊本身就是單例

# singleton_module.py
class MySingleton:passinstance = MySingleton()
# main.py
from singleton_module import instancea = instance
b = instance
print(a is b)  # True
  • 特點:Python 模塊天然單例
  • 想象一下,模塊就像整個城市的唯一冰箱,大家都能直接去用

注意事項

  • 線程安全:多線程環境可能同時創建多個實例,需要加鎖保護
  • 不要濫用:單例是工具,不是全局變量的萬能替代
  • 繼承問題:子類可能打破單例,需要特別處理

總結

單例模式就像 程序里的冰箱

  • 獨一無二:全局只有一個實例
  • 高效共享:避免重復資源浪費
  • 有序管理:讓全局狀態清晰可控

????????下次當你遇到“必須保證唯一”的場景,想想冰箱,單例模式就自然而然地閃現在腦海里。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97963.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI大模型學習(6)Yolo V8神經網絡的基礎應用

Yolo V8神經網絡的基礎應用2024-2025年最火的目標檢測神器,一篇文章讓你徹底搞懂!🤩大家好呀!今天我們要聊一聊計算機視覺領域的「明星模型」——YOLO神經網絡!🎯 如果你對「目標檢測」這個詞還比較陌生&am…

C++:imagehlp庫

imagehlp庫1. 簡介2. 主要函數與用途2.1PE 文件解析相關2.2 符號處理相關2.3 崩潰轉儲相關2.4 版本資源相關3. 使用示例3.1 解析內存地址對應的函數名和行號3.2 創建目錄使用示例1. 簡介 imagehlp 是 Windows 系統提供的一個圖像處理與調試輔助 API 庫(Image Helpe…

如何在Anaconda中配置你的CUDA Pytorch cuNN環境(2025最新教程)

目錄 一、簡介 二、下載CUDA 三、下載Pytorch-GPU版本 四、下載CUDNN 五、總結 六、測試代碼 一、簡介 啥是Anaconda?啥是CUDA?啥是CUDNN?它們和Pytorch、GPU之間有啥關系? 怎么通俗解釋它們三者的用途和關系? 1.GPU(圖形處理單元&#xff09…

算法面試(1)-----目標檢測和圖像分類、語義分割的區別

操作系統:ubuntu22.04 IDE:Visual Studio Code 編程語言:C11 算法描述 目標檢測(Object Detection)、圖像分類(Image Classification)、語義分割(Semantic Segmentation) 是計算機視…

電腦散熱風扇有噪音怎么解決

一、初步檢查與清理斷電并拆機關閉電腦并拔掉電源,打開機箱側板(筆記本需先拆除后蓋螺絲)。操作前建議佩戴防靜電手環,避免靜電損壞硬件。清理風扇及散熱片灰塵使用壓縮空氣罐從風扇進風口吹走灰塵,或用軟毛刷輕輕刷去…

SeaweedFS深度解析(九):k8s環境使用helm部署Seaweedfs集群

上一篇:《SeaweedFS深度解析(八):k8s環境使用Operator部署Seaweedfs集群》 鏈接: link #作者:閆乾苓 文章目錄k8s環境使用helm部署Seaweedfs集群準備鏡像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB繪制一個新穎的混沌圖像(新四翼混沌系統)

新四翼混沌系統:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代碼:function plot_novel_chaotic_system() % 參數設置 a 10; b 8/3; c 28;% 初始條件 x0 [1, 1, 1];% 時間范圍 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融數據---獲取股票日線數據

獲取股票日線的數據方式有很多,包括東方財富,同花順,tushare,這里我們就利用東方財富的數據,是免費的開源獲取,第一步先安裝akshare,pip安裝就可以py -m pip install akshareAkshare 股票數據獲…

Mac 真正多顯示器支持:TESmart USB-C KVM(搭載 DisplayLink 技術)如何實現

多顯示器已經不再是奢侈品,而是專業人士提升生產力的必需工具。無論是創意設計師、股票交易員還是軟件開發人員,多屏幕都能讓工作流程更高效、更有條理。 然而,Mac 用戶長期以來面臨一個主要障礙:macOS 原生不支持多流傳輸&#x…

【實時Linux實戰系列】靜態鏈接與libc選擇:musl vs glibc的時延權衡

背景與重要性 在實時系統開發中,選擇合適的C標準庫(libc)和鏈接方式對系統的啟動時間、線程性能和內存分配效率有著顯著影響。glibc和musl是兩種流行的C標準庫實現,它們在設計目標和性能表現上存在差異。通過對比這兩種libc在啟動…

Altium Designer(AD24)的三種文件組織形式,工程文件,自由文件與存盤文件

??《專欄目錄》 目錄 1,概述 2,工程文件 3,自由文件 4,存盤文件 5,文件轉換 5.1,工程文件于自由文件互轉換 5.2,工程文件于存盤文件互轉換 6,注意事項 1,概述 本文介紹Altium Designer 24軟件(后文簡稱AD24或軟件)的三種文件組織形式,工程文件,自由文件和存盤文…

Python+Selenium實現自動化測試

🍅 點擊文末小卡片 ,免費獲取軟件測試全套資料,資料在手,漲薪更快安裝selenium打開命令控制符輸入:pip install -U selenium火狐瀏覽器安裝firebug:www.firebug.com,調試所有網站語言&#xff0…

2024年CSP-X初賽真題及答案解析(6-10)

2024年CSP-X初賽真題及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 長度 1: 3 個(a, b, c) 長度 2: 3 個(ab, bc, ca) 長度 3: 3 個(abc, bca, cab) 長度 4: 3 個(abca, bcab, cabc) 長度 5: 3 個(a…

緩存與數據庫一致性的4大坑及終極解決方案

緩存雪崩、擊穿、穿透全中招?別讓緩存與數據庫的“愛恨情仇”毀了你的系統! 你有沒有經歷過這樣的深夜告警:Redis 響應延遲飆升,數據庫 CPU 直沖 100%,接口大面積超時?一查日志,發現大量請求繞過…

基于 Python charm 庫實現的一些 Pairing 密碼學算法

基于 Python charm 庫實現了一些 Pairing 密碼學算法,放在了 https://github.com/BatchClayderman/Cryptography-Schemes 里面。 在正確部署了 Python charm 庫后,所有的 Python 腳本都是獨立的,即該存儲庫中不存在一個腳本調用另一個腳本的…

用戶體驗五大要點:從問題到解決方案的完整指南

在互聯網產品設計和運營的過程中,用戶體驗(User Experience,簡稱 UX) 已經成為決定產品成敗的關鍵因素。一個功能再強大的產品,如果用戶用得不舒服、不信任,甚至覺得沒有價值,最終都會被拋棄。那…

MySQL 外鍵約束:表與表之間的 “契約”,數據一致性的守護者

MySQL 外鍵約束:表與表之間的 “契約”,數據一致性的守護者 在 MySQL 數據庫設計中,外鍵約束(FOREIGN KEY)是維護表之間關聯關系的核心工具。它就像表與表之間的一份 “契約”,確保從表(如訂單…

《投資-54》元宇宙

元宇宙(Metaverse)是一個近年來備受關注的概念,它描繪了一個虛擬與現實交融、由多個互連的3D虛擬世界組成的沉浸式數字環境。用戶可以通過虛擬現實(VR)、增強現實(AR)、互聯網和其他技術&#x…

【數據結構】Java集合框架:List與ArrayList

文章目錄一、認識List接口1.1 List的定義與繼承關系1.2 Collection接口的核心方法1.3 List接口的獨特方法二、線性表與順序表基礎2.1 線性表2.2 順序表自定義順序表(MyArrayList)實現1. 前期準備:自定義異常類2. MyArrayList核心結構3. 工具方…

K8S里的“豌豆莢”:Pod

1. 為什么要有podPod 這個詞原意是“豌豆莢”,后來又延伸出“艙室”“太空艙”等含義,你可以看一下這張圖片,形 象地來說 Pod 就是包含了很多組件、成員的一種結構。之前的容器技術讓進程在一個“沙盒”環境里運行,具有良好的隔離…