Java 設計模式-【單例模式】

單例解決了什么問題:為了節約系統資源,有時需要確保系統中某個類只有唯一一個實例,當這個唯一實例創建成功之后,我們無法再創建一個同類型的其他對象,所有的操作都只能基于這個唯一實例。為了確保對象的唯一性,我們可以通過單例模式來實現,這就是單例模式的動機所在。

單例的應用場景:一般是對于那些業務邏輯上限定不能多例只能單例的情況,例如:類似于計數器之類的存在,一般都需要使用一個實例來進行記錄,若多例計數則會不準確。

?

?

餓漢式:

  條件:

  1. 構造器私有化
  2. 本類對象作為本類的屬性存在 用static 修飾保證只加載一次,不會重復創建對象
  3. 公共的靜態的方法可以通過該方法拿到屬性

?  優缺點:

    優點:安全

    缺點:可能會導致對象創建過早

 1 package com.設計模式;
 2 
 3 /**
 4  * 餓漢式
 5  */
 6 public class ObjectShow1 {
 7     public static int i = 123;
 8     //靜態私有成員,類在加載初期完成初始化;同時帶來加載過早的問題
 9     private static ObjectShow1 objectShow1 = new ObjectShow1();
10 
11     private ObjectShow1() {
12         //私有構造函數,只能被列對象初始化
13         System.out.println(i);
14     }
15 
16     //使用public對外開放獲取本類對象
17     public static ObjectShow1 getObjectShow1() {
18         return objectShow1;
19     }
20 }
View Code

?

?

懶漢式:

?????? 條件:

  1. 構造器私有化
  2. 本類對象作為本類的屬性存在 static 修飾 但是不進行初始化
  3. 公共的靜態方法 并且判斷是否給屬性賦值

優缺點:

    優點:對象總是被需要的時候才被創建 解決了可能加載時機過早的問題

    缺點:在線程初期 線程不安全

 1 package com.設計模式;
 2 
 3 /**
 4  * 懶漢式
 5  */
 6 public class ObjectShow2 {
 7     public static int i = 123;
 8     //靜態私有成員,不用構造器進行初始化
 9     private static ObjectShow2 objectShow2 = null;
10 
11     private ObjectShow2() {
12         //私有構造函數,只能被列對象初始化
13         System.out.println(i);
14     }
15 
16     //使用public對外開放獲取本類對象,只有調用方法才會進行初始化
17     public static ObjectShow2 getObjectShow2() {
18         if (objectShow2 == null) {
19             objectShow2 = new ObjectShow2();
20         }
21         return objectShow2;
22     }
23 }
View Code

?

?

雙重檢索式:

?????? 條件:

?????? 1.構造器私有化

?????? 2.本類的對象作為奔雷的屬性存在 static 修飾 但不進行初始化

?????? 3.公共的靜態方法 并且判斷是否給屬性賦值

優缺點:

    程序的前期 線程不安全

    Synchronized 鎖

    Synchronized 代碼塊 要求同一時間只有一個線程進入代碼塊區域

    因為jvm內存模型的原因 雙重檢索 也會有微小的可能發生問題

 1 package com.設計模式;
 2 
 3 /**
 4  * 雙重檢索式
 5  */
 6 public class ObjectShow3 {
 7     public static int i = 123;
 8     //靜態私有成員,不用構造器進行初始化
 9     private static ObjectShow3 objectShow3;
10 
11     private ObjectShow3() {
12         //私有構造函數,只能被列對象初始化
13         System.out.println(i);
14     }
15 
16     //使用public對外開放獲取本類對象,只有調用方法才會進行初始化
17     public static ObjectShow3 getObjectShow3() {
18         if (objectShow3 == null) {
19             //同步塊,線程安全的創建實例
20             synchronized (ObjectShow3.class) {
21                 //再次檢查實例是否存在,不在才創建
22                 if (objectShow3 == null)
23                     objectShow3 = new ObjectShow3();
24             }
25         }
26         return objectShow3;
27     }
28 }
View Code

?

?

靜態內部類式:

條件:

?????? 1.定義一個靜態內部類

?????? 2.外部類構造器私有化

?????? 3.外部類的對象 作為內部類的屬性存在 static 修飾 進行初始化

?????? 4.公共的靜態方法

優缺點:

    解決了,對象創建時機過早的問題

    沒有產生線程安全問題

 1 package com.設計模式;
 2 
 3 /**
 4  * 靜態內部類式
 5  */
 6 public class ObjectShow4 {
 7     public static int i = 123;
 8 
 9     static class InitObjectShow {
10         private static ObjectShow4 os = new ObjectShow4();
11 
12         public static ObjectShow4 getObj() {
13             return os;
14         }
15     }
16 
17     private ObjectShow4() {
18         System.out.println("ObjectShow4.ObjectShow4");
19     }
20 
21     public void show() {
22         System.out.println("ObjectShow4.show");
23     }
24 }
View Code

?

轉載于:https://www.cnblogs.com/shwang/p/9325666.html

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

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

相關文章

Lua游戲開發----模塊

1:游戲目錄結構對模塊的理解: Base,Common,Game這三個文件夾下都有自己的moduleConfig文件。 base文件夾下的moduleConfig.lua文件是存放游戲基礎的模塊(例如:游戲視圖準備,發牌,托管…

css 引用 方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 CSS 樣式一共 3 中使用方法 ——內聯式樣式表行樣式<div style"color:#000;"></div>只能操作1個標簽&#xff0…

java構造方法

構造方法是一種特殊的方法&#xff0c;它是一個與類同名且沒有返回值類型的方法。對象的創建就是通過構造方法來完成&#xff0c;其功能主要是完成對象的初始化。當類實例化一個對象時會自動調用構造方法。構造方法和其他方法一樣也可以重載。 構造方法就是與類同名的那個方法…

轉 單實例的寫法

目錄 餓漢法單線程寫法考慮線程安全的寫法兼顧線程安全和效率的寫法坑靜態內部類法枚舉寫法總結參考資料轉載: 你真的會寫單例模式嗎——Java實現 單例模式可能是代碼最少的模式了&#xff0c;但是少不一定意味著簡單&#xff0c;想要用好、用對單例模式&#xff0c;還真得費一…

網絡爬蟲--26.Scrapy中下載器中間件Downloader Middlewares的使用

文章目錄一. Downloader Middlewares二. 設置隨機請求頭三. ip代理池中間件一. Downloader Middlewares 二. 設置隨機請求頭 三. ip代理池中間件

變量名和方法名

變量名&#xff1a;第一個單詞的首字母小寫&#xff0c;后面每一個單詞的首字母大寫。如userName; 方法名&#xff1a;第一個單詞的首字母小寫&#xff0c;后面每一個單詞的首字母大寫。如setName&#xff08;&#xff09;; 寫出讓人一眼看懂的變量名和方法名&#xff0c;命名應…

openfire服務器

openfire(原名Wildfire或者JiveMessenger)是由Java語言編寫的、基于XMPP協議的服務器&#xff0c;具有跨平臺能力&#xff0c;獲得了Apache2.0許可證。 openfire是基于XMPP協議的IM的服務器端的一個實現&#xff0c;兩個用戶想要進行通訊&#xff0c;首先要連接到Openfire。服…

解決eclipse配置Tomcat時找不到server選項(Mars.2也可用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 集成Eclipse和Tomcat時找不到server選項&#xff1a; 按照網上的步驟如下&#xff1a; 在Eclipse中&#xff0c;窗口(window)——首選項…

網絡爬蟲--27.csv文件的讀取和寫入

文章目錄一. csv文件二. 讀取csv文件的兩種方式三. 寫入csv文件的兩種方式一. csv文件 二. 讀取csv文件的兩種方式 import csvdef read_csv_demo1():with open(classroom1.csv,r,encodingutf-8,newline) as fp:# reader是一個迭代器reader csv.reader(fp)next(reader)for x i…

Quiver快速入門

Quiver快速入門 裝載自&#xff1a;https://github.com/HappenApps/Quiver/wiki/Quiver%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8Quiver 是一個程序員專用的記事本應用&#xff0c;可輕松混合文本、代碼、Markdown、LaTeX 到一個記事本中。提供強大的代碼編輯功能&#xff0c;以及…

const指針和指向常量的指針

先看下面六種寫法&#xff1a; 1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p; 那么我們應該怎么區分上面的寫法到底是指向常量的指針還是const指針(表示指針本身是常量)呢&#xff1f; 一個簡便方法&#…

配置SQL Server的身份驗證方式

下面的文章來源于網絡&#xff0c;講的是怎樣配置SQL Server 2005登陸驗證方式&#xff0c;但是內容同樣適用于SQL Server 2008. 配置SQL Server的身份驗證方式 在默認情況下&#xff0c;SQL Server 2005 Express是采用集成的Windows安全驗證且禁用了sa登錄名。為了工作組環境下…

計算機程序設計藝術+第3卷:排序與查找(第二版)pdf

下載地址&#xff1a;網盤下載 《計算機程序設計藝術排序和查找(第3卷)(第2版)》內容簡介&#xff1a;這是對第3卷的頭一次修訂&#xff0c;不僅是對經典計算機排序和查找技術的最全面介紹&#xff0c;而且還對第1卷中的數據結構處理技術作了進一步的擴充&#xff0c;通盤考慮了…

數據結構與算法--5.Python實現十大排序算法

文章目錄0. 相關概念一. 冒泡排序二. 選擇排序三. 插入排序四. 希爾排序五. 快速排序六. 歸并排序七. 其他0. 相關概念 穩定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面。不穩定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xf…

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 問題

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 maven run as --install 時出錯&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各組件常用配置參數

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 設為false&#xff0c;關閉自我保護eureka.server.eviction-interval-timer-in-ms # 清理間隔&#xff08;單位毫秒&#xff0c;默認是60*1000&#xff09;eureka.environmentdev #指定環境eureka…

JSON與XML的區別比較

1.定義介紹 (1).XML定義 擴展標記語言 (Extensible Markup Language, XML) &#xff0c;用于標記電子文件使其具有結構性的標記語言&#xff0c;可以用來標記數據、定義數據類型&#xff0c;是一種允許用戶對自己的標記語言進行定義的源語言。 XML使用DTD(document type defini…

ajax傳遞數組:屬性traditional設置

jQuery.ajaxSettings.traditional true; $.post("",function(){});轉載于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面試題總結(9)--高級特性

文章目錄1. 函數裝飾器有什么作用&#xff1f;請列舉說明&#xff1f;2. Python 垃圾回收機制&#xff1f;3. 魔法函數 _call_怎么使用?4. 如何判斷一個對象是函數還是方法&#xff1f;5. classmethod 和 staticmethod 用法和區別6. Python 中的接口如何實現&#xff1f;7. Py…

I/O流講解

本文來自&#xff1a;曹勝歡博客專欄&#xff1a;http://blog.csdn.net/csh624366188 在軟件開發中&#xff0c;數據流和數據庫操作占據了一個很重要的位置&#xff0c;所以&#xff0c;熟悉操作數據流和數據庫&#xff0c;對于每一個開發者來說都是很重要的&#xff0c;今天就…