設計模式-單例模式(創建型)

創建型-單例模式

了解單例

單例模式是一種創建型設計模式,它提供了一種創建對象的最佳方式;它必須保證:

  1. 單例類只能有一個實例化對象;
  2. 單例類必須創建自己的唯一實例;
  3. 單例類必須給其他對象提供實例;

另外:

  1. 它的目的是:確保一個類只用一個實例,并提供一種全局訪問入口來訪問該實例
  2. 設計思想:在獲取實例的時候判斷實例是否存在,如果存在,則直接返回,如果不存在則創建實例;
  3. 關鍵代碼:構造方法私有化;

角色

  1. 單例類:包含單例實例的類
  2. 靜態成員變量:用于存儲單例的靜態成員變量,final修飾防止被繼承
  3. 獲取實例方法:靜態方法,用于獲取單例實例
  4. 私有構造方法:防止外部直接實例化類
  5. 線程安全處理:確保多線程環境下單例創建的安全性

實現方式

餓漢式單例

特點:類一加載就實例化單例對象

public class Mgr01 {//靜態成員變量存儲單例,final修飾防止被繼承private final static Mgr01 INSTANCE = new Mgr01();//構造方法私有化,防止外部直接實例化private Mgr01() {}//靜態方法,用于獲取單例public static Mgr01 getInstance(){return INSTANCE;}
}

另一種寫法,在靜態代碼塊中實例化對象

public class Mgr02 {private final static Mgr02 INSTANCE ;static {INSTANCE = new Mgr02();}public static Mgr02 getMgr02() {return INSTANCE;}
}

懶漢式單例

特點: 使用單例時才實例化對象

線程不安全寫法:

    public class Mgr03 {private static Mgr03 INSTANCE;private Mgr03() {}public static Mgr03 getInstance(){//模擬執行其他操作所用的時間if( INSTANCE == null){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}INSTANCE = new Mgr03();}return INSTANCE;}
}

synchronized鎖獲取實例靜態方法,保證線程安全:

public class Mgr04 {private static Mgr04 INSTANCE;private Mgr04() {}public static synchronized Mgr04 getInstance(){//模擬執行其他操作所用的時間if( INSTANCE == null){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}INSTANCE = new Mgr04();}return INSTANCE;}
}

雙重檢驗鎖(DCL)單例:

  1. 第一層null值檢測是為了在已經存在單例的情況下不需要等鎖提高效率,第二次null判斷是為了保證單例。
  2. volatile關鍵字的作用:如果不使用volatile關鍵字那么,創建單例過程可能被拆分為以下幾步,①為單例對象分配內存空間;②初始化單例對象;③將INSTANCE變量指向分配的內存空間。在沒有volatile 關鍵字的情況下,步驟②和③可能會被重排序。這就可能導致其他線程在執行getInstance() 方法時,看到的 INSTANCE 變量已經被賦值,但單例對象并沒有被完成初始化。
public class Mgr06 {private static volatile Mgr06 INSTANCE;//volatile 是為了防止JVM中語句重排private Mgr06() {}public static  Mgr06 getInstance(){//這個判斷可以屏蔽很多操作,很多線程到這,如果已INSTANCE已經存在,可以減少下面代碼的執行,提升效率if( INSTANCE == null){synchronized (Mgr06.class){if(INSTANCE == null){try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}INSTANCE = new Mgr06();}}}return INSTANCE;}
}

靜態內部類單例

這種方法是通過JVM保證單例,JVM在加載外部類時,只加載一次,且內部類在使用時才會加載,也就是第一次調用獲取實例的方法時候才會調用。
其中,內部類私有化,內部類中的靜態變量也私有化;

public class Mgr07 {private static class MGR_07{private final static Mgr07 INSTANCE = new Mgr07();}public static Mgr07 getInstance(){return MGR_07.INSTANCE;}
}

枚舉單例

枚舉單例不但可以保證單例,還可以防止反序列化,因為枚舉沒有構造方法。

public enum Mgr08 {INSTANCE
}

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

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

相關文章

【面試筆記】嵌入式軟件工程師,汽車電子軟件相關

文章目錄 1. C語言基礎1.1 const1.2 static1.3 回調函數的用法1.4 宏定義1.5 編譯、鏈接過程1.6 堆與棧的區別?1.7 簡單的字符串算法題,C語言實現1.7.1 給定一個字符串,按順序篩選出不重復的字符組成字符串,輸出該字符串1.7.2 給定…

Python3 迭代器和生成器

前言 本文主要介紹Python中的迭代器和生成器,主要內容包括 迭代器概述、生成器簡介。 文章目錄 前言一、迭代器簡介二、生成器簡介 一、迭代器簡介 在 Python 中,迭代器(iterator)是一個實現了迭代器協議(Iterator Protocol)的…

opencv進階 ——(十一)基于RMBG實現生活照生成寸照

實現步驟 1、檢測人臉,可以使用opencv自帶的級聯分類器或者dlib實現人臉檢測 2、放大人臉范圍,調整到正常寸照尺寸 3、基于RMGB算法得到人像掩碼 4、生成尺寸相同的純色背景與當前人像進行ALPHA融合即可 alpha融合實現 void alphaBlend(cv::Mat&…

1 機器人軟件開發學習所需通用技術棧(一)

機器人軟件工程師技術路線(如有缺失,歡迎補充) 1. 機器人軟件開發工程師技術路線 1.1 基礎知識 C/C編程:掌握C/C語言基礎,包括數據結構、算法、內存管理等。操作系統:了解Linux或Windows等操作系統的基本…

android 13 aosp 預置so庫

展訊對應的main.mk配置 device/sprd/qogirn**/ums***/product/***_native/main.mk $(call inherit-product-if-exists, vendor/***/build.mk)vendor/***/build.mk PRODUCT_PACKAGES \libtestvendor///Android.bp cc_prebuilt_library_shared{name:"libtest",srcs:…

2.1 初識Windows程序

Windows程序設計是一種面向對象的編程。Windows操作系統以數據結構的形式定義了大量預定義的對象作為操作系統的數據類型。Windows動態鏈接庫提供了各種各樣的API接口函數供Windows應用程序調用。一個Windows應用程序是運行在Windows操作系統之上的。這些API接口函數的調用所實…

1349:【例4-10】最優布線問題

【解題思路】 最小生成樹模板題&#xff0c;求最小生成樹所有邊權加和。 該題輸入的是鄰接矩陣&#xff0c;因此使用鄰接矩陣解決該問題。當然也可以保存為鄰接表。 【參考代碼】 //示例代碼 Prim算法 #include <iostream> #include <cstring> #include <cs…

【Vue】路由的基本使用

文章目錄 一、固定5個固定的步驟二、代碼示例三、兩個核心步驟四、完整代碼 vue-router插件作用 修改地址欄路徑時&#xff0c;切換顯示匹配的組件 說明 Vue 官方的一個路由插件&#xff0c;是一個第三方包 官網 https://v3.router.vuejs.org/zh/ VueRouter的使用&#xff0…

TCP/IP協議介紹——三次握手四次揮手

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP 和IP兩個協議&#xff0c;而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議…

CSS學習|css三種導入方式、基本選擇器、層次選擇器、結構偽類選擇器、屬性選擇器、字體樣式、文本樣式

第一個css程序 css程序都是在style標簽中書寫 打開該網頁&#xff0c;可以看到h1標簽中的我是標題被渲染成了紅色 可以在同級目錄下創建一個css目錄&#xff0c;專門存放css文件&#xff0c;可以和html分開編寫 然后在html頁面中&#xff0c;利用link標簽以及css文件地址&…

大模型基架:Transformer如何做優化?

大模型的基礎模式是transformer&#xff0c;所以很多芯片都實現先專門的transformer引擎來加速模型訓練或者推理。本文將拆解Transformer的算子組成&#xff0c;展開具體的數據流分析&#xff0c;結合不同的芯片架構實現&#xff0c;分析如何做性能優化。 Transformer結構 tr…

go的反射和斷言

在go中對于一個變量&#xff0c;主要包含兩個信息變量類型&#xff08;type&#xff09;和變量值&#xff08;value&#xff09; 可以通過reflect包在運行的時候動態獲取變量信息&#xff0c;并能夠進行操作 對于Type可以通過reflect.TypeOf()獲取到變量的類型信息 reflect.Ty…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用軟件工程的方法來單獨解決前端的開發流程中模塊化、組件化、規范化、自動化的問題,其主要目的為了提高效率和降低成本。 前后端分離&#xff08;前端代碼工程化獨立出來形成一個單獨的app&#xff09; 1.開發分離 2.部署分離 3.服務器分離…

信號(上)

本節目標&#xff1a; 1. 掌握Linux信號的基本概念 2. 掌握信號產生的一般方式 3. 理解信號遞達和阻塞的概念&#xff0c;原理。 4. 掌握信號捕捉的一般方式。 5. 重新了解可重入函數的概念。 6. 了解競態條件的情景和處理方式 7. 了解SIGCHLD信號&#xff0c; 重新編寫信號處理…

ChatGPT基本原理詳細解說

ChatGPT基本原理詳細解說 引言 在人工智能領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;一直是研究的熱點之一。隨著技術的發展&#xff0c;我們見證了從簡單的聊天機器人到復雜的語言模型的演變。其中&#xff0c;ChatGPT作為一項突破性技術&#xff0c;以其強大…

【Vue】自定義指令-v-loading指令的封裝

場景 實際開發過程中&#xff0c;發送請求需要時間&#xff0c;在請求的數據未回來時&#xff0c;頁面會處于空白狀態 > 用戶體驗不好 需求 封裝一個 v-loading 指令&#xff0c;實現加載中的效果 分析 本質 loading效果就是一個蒙層&#xff0c;蓋在了盒子上 數據請求…

從零開始精通Onvif之設備發現

設備發現的意義 在復雜的網絡環境中&#xff0c;如何快速而準確地識別網絡上的Onvif設備&#xff0c;對于攝像頭廠商、系統集成商、開發人員乃至最終用戶來說&#xff0c;都顯得至關重要。 首先&#xff0c;設備發現有效簡化了集成的復雜度。在沒有統一標準之前&#xff0c;每個…

2004NOIP普及組真題 2. 花生采摘

線上OJ&#xff1a; 【04NOIP普及組】花生采摘 核心思想&#xff1a; 1、本題為貪心即可。 2、因為本題嚴格限制了順序&#xff0c;所以先把每個節點的花生數量按降序排序。然后逐一判斷下一個花生是否需要去采摘即可 3、每一次采摘完&#xff0c;記錄耗時 t 以及采集的花…

力扣第417題測試程序

題目描述&#xff1a; 有一個 m n 的矩形島嶼&#xff0c;與 太平洋 和 大西洋 相鄰。 “太平洋” 處于大陸的左邊界和上邊界&#xff0c;而 “大西洋” 處于大陸的右邊界和下邊界。 這個島被分割成一個由若干方形單元格組成的網格。給定一個 m x n 的整數矩陣 heights &#…

基于web的垃圾分類回收系統的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;管理員管理&#xff0c;用戶管理&#xff0c;公告管理&#xff0c;運輸管理&#xff0c;基礎數據管理 用戶賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;運輸管理&#xff0c;公告…