單例模式java,單例模式java應用場景

本文目錄一覽:

java 單例模式

System.out.println (Singleton.getInstance());

System.out.println (Singleton.getInstance());

main 函數中有這兩句,一摸一樣。

第一句執行的時候,第一次調用getInstance(),意思是要獲取Singleton的一個對象實例。

而正常情況下,我們要獲取對象的話是用 new Singleton(),這個方法的,但是這個方法在Singleton裡面被聲明為:private ,意思是外界不能調用。

不能調用,我怎麼用你的對象?

Singleton裡面實現了生成對象的方法,getInstance(),你要用他的對象就必須調用這個方法。

而這個方法裡面你也看到了,如果

if(instance == null){

instance = new Singleton();

}

如果沒有實例則創建一個新的,但是已經創建過的話,就返回已經存在的實例。

所以輸出結果:

net.chelson.chapter5.Singleton@de6ced

net.chelson.chapter5.Singleton@de6ced

你兩次調用的這個對象的內存地址都是相同的,也就是說,是同一個東西(對象)

這個總的來說就是:

類的構造方法私有化(防止外界構造新對象)

提供獲取實例的方法(用於外界調用)

作用:用於提供只能有一個實例的對象。

Java單例模式是什麼意思?

Java單例模式是確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例,在計算機系統中,線程池、緩存、日誌對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例的模式;

Java單例模式分三種:懶漢式單例、餓漢式單例、登記式單例。

(1)Java單例模式有以下特點:單例類只能有一個實例;單例類必須自己創建自己的唯一實例;單例類必須給所有其他對象提供這一實例。

(2)Java單例模式的應用範圍:每台計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中,每台計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。

在Java中,單例設計模式是什麼意思?有什麼優勢?

單例模式:保證一個類在使用過程中,只有一個實例。

優勢就是單例模式的作用,這個類永遠只有一個實例。

還在於可以節省內存,因為它限制了實例的個數,有利於Java垃圾回收。

java的學習建議:

首先要看書讀理論,不一定都懂,因為有一個懂的過程;

然後就是分析代碼,看看書上的代碼的意思,逐行逐行地看,去體會;

最重要的一點就是敲寫代碼,剛開始不會沒關係,照着書一行一行的敲,然後運行,觀察結果,把程序運行結果聯繫程序代碼,學得多一點了就嘗試修改代碼,改一點點看運行結果有什麼變化,便於理解程序內部執行的機制。

在java開發中,為什麼要使用單例模式?

java單例模式確保一個類只有一個實例,自行提供這個實例並向整個系統提供這個實例。\x0d\x0a特點:\x0d\x0a1,一個類只能有一個實例;\x0d\x0a2,自己創建這個實例;\x0d\x0a3,整個系統都要使用這個實例。\x0d\x0a——————————–\x0d\x0aSingleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。一些資源管理器常常設計成單例模式。\x0d\x0a外部資源:譬如每台計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每台計算機可以有若干個通信端口,系統應當集中管理這些通信端口,以避免一個通信端口被兩個請求同時調用。\x0d\x0a內部資源,譬如,大多數的軟件都有一個(甚至多個)屬性文件存放系統配置。這樣的系統應當由一個對象來管理這些屬性文件。\x0d\x0a——————————–\x0d\x0a單例模式,能避免實例重複創建;\x0d\x0a單例模式,應用於避免存在多個實例引起程序邏輯錯誤的場合;\x0d\x0a單例模式,較節約內存。

Java模式設計之單例模式(二)

在什麼情況下使用單例模式

使用單例模式的條件

使用單例模式有一個很重要的必要條件

在一個系統要求一個類只有一個實例時才應當使用單例模式 反過來說 如果一個類可以有幾個實例共存 那麼就沒有必要使用單例類 但是有經驗的讀者可能會看到很多不當地使用單例模式的例子 可見做到上面這一點並不容易 下面就是一些這樣的情況

例子一

問 我的一個系統需要一些 全程 變量 學習了單例模式後 我發現可以使用一個單例類盛放所有的 全程 變量 請問這樣做對嗎?

答 這樣做是違背單例模式的用意的 單例模式只應當在有真正的 單一實例 的需求時才可使用

一個設計得當的系統不應當有所謂的 全程 變量 這些變量應當放到它們所描述的實體所對應的類中去 將這些變量從它們所描述的實體類中抽出來 放到一個不相干的單例類中去 會使得這些變量產生錯誤的依賴關係和耦合關係

例子二

問 我的一個系統需要管理與數據庫的連接 學習了單例模式後 我發現可以使用一個單例類包裝一個Connection 對象 並在finalize()方法中關閉這個Connection 對象 這樣的話 在這個單例類的實例沒有被人引用時 這個finalize() 對象就會被調用 因此 Connection 對象就會被釋放 這多妙啊

答 這樣做是不恰當的 除非有單一實例的需求 不然不要使用單例模式 在這裡Connection 對象可以同時有幾個實例共存 不需要是單一實例

單例模式有很多的錯誤使用案例都與此例子相似 它們都是試圖使用單例模式管理共享資源的生命周期 這是不恰當的

單例類的狀態

有狀態的單例類

一個單例類可以是有狀態的(stateful) 一個有狀態的單例對象一般也是可變(mutable) 單例對象

有狀態的可變的單例對象常常當做狀態庫(repositary)使用 比如一個單例對象可以持有一個int 類型的屬性 用來給一個系統提供一個數值惟一的序列號碼 作為某個販賣系統的賬單號碼 當然 一個單例類可以持有一個聚集 從而允許存儲多個狀態

沒有狀態的單例類

另一方面 單例類也可以是沒有狀態的(stateless) 僅用做提供工具性函數的對象 既然是為了提供工具性函數 也就沒有必要創建多個實例 因此使用單例模式很合適 一個沒有狀態的單例類也就是不變(Immutable) 單例類 關於不變模式 讀者可以參見本書的 不變(Immutable )模式 一章

多個JVM 系統的分散式系統

EJB 容器有能力將一個EJB 的實例跨過幾個JVM 調用 由於單例對象不是EJB 因此 單例類局限於某一個JVM 中 換言之 如果EJB 在跨過JVM 後仍然需要引用同一個單例類的話 這個單例類就會在數個JVM 中被實例化 造成多個單例對象的實例出現 一個J EE應用系統可能分布在數個JVM 中 這時候不一定需要EJB 就能造成多個單例類的實例出現在不同JVM 中的情況

如果這個單例類是沒有狀態的 那麼就沒有問題 因為沒有狀態的對象是沒有區別的 但是如果這個單例類是有狀態的 那麼問題就來了 舉例來說 如果一個單例對象可以持有一個int 類型的屬性 用來給一個系統提供一個數值惟一的序列號碼 作為某個販賣系統的賬單號碼的話 用戶會看到同一個號碼出現好幾次

在任何使用了EJB RMI 和JINI 技術的分散式系統中 應當避免使用有狀態的單例模式

多個類加載器

同一個JVM 中會有多個類加載器 當兩個類加載器同時加載同一個類時 會出現兩個實例 在很多J EE 服務器允許同一個服務器內有幾個Servlet 引擎時 每一個引擎都有獨立的類加載器 經有不同的類加載器加載的對象之間是絕緣的

lishixinzhi/Article/program/Java/gj/201311/27644

JAVA單例模式有哪些?

一、懶漢式單例\x0d\x0a在類加載的時候不創建單例實例。只有在第一次請求實例的時候的時候創建,並且只在第一次創建後,以後不再創建該類的實例。\x0d\x0a \x0d\x0apublic class LazySingleton {\x0d\x0a /**\x0d\x0a * 私有靜態對象,加載時候不做初始化\x0d\x0a */\x0d\x0a private static LazySingleton m_intance=null;\x0d\x0a /**\x0d\x0a * 私有構造方法,避免外部創建實例\x0d\x0a */\x0d\x0a private LazySingleton(){\x0d\x0a }\x0d\x0a /**\x0d\x0a * 靜態工廠方法,返回此類的唯一實例. \x0d\x0a * 當發現實例沒有初始化的時候,才初始化.\x0d\x0a */\x0d\x0a synchronized public static LazySingleton getInstance(){\x0d\x0a if(m_intance==null){\x0d\x0a m_intance=new LazySingleton();\x0d\x0a }\x0d\x0a return m_intance;\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a二、餓漢式單例\x0d\x0a在類被加載的時候,唯一實例已經被創建。\x0d\x0a \x0d\x0apublic class EagerSingleton {\x0d\x0a /**\x0d\x0a * 私有的(private)唯一(static final)實例成員,在類加載的時候就創建好了單例對象\x0d\x0a */\x0d\x0a private static final EagerSingleton m_instance = new EagerSingleton();\x0d\x0a /**\x0d\x0a * 私有構造方法,避免外部創建實例\x0d\x0a */\x0d\x0a private EagerSingleton() {\x0d\x0a }\x0d\x0a /**\x0d\x0a * 靜態工廠方法,返回此類的唯一實例.\x0d\x0a * @return EagerSingleton\x0d\x0a */\x0d\x0a public static EagerSingleton getInstance() {\x0d\x0a return m_instance;\x0d\x0a }\x0d\x0a}\x0d\x0a \x0d\x0a************************************************************************************** 懶漢方式,指全局的單例實例在第一次被使用時構建; \x0d\x0a餓漢方式,指全局的單例實例在類裝載時構建 \x0d\x0a**************************************************************************************\x0d\x0a\x0d\x0a三、登記式單例\x0d\x0a這個單例實際上維護的是一組單例類的實例,將這些實例存放在一個Map(登記薄)中,對於已經登記過的實例,則從工廠直接返回,對於沒有登記的,則先登記,而後返回。\x0d\x0apublic class RegSingleton {\x0d\x0a /**\x0d\x0a * 登記薄,用來存放所有登記的實例\x0d\x0a */\x0d\x0a private static Map m_registry = new HashMap();\x0d\x0a //在類加載的時候添加一個實例到登記薄\x0d\x0a static {\x0d\x0a RegSingleton x = new RegSingleton();\x0d\x0a m_registry.put(x.getClass().getName(), x);\x0d\x0a }\x0d\x0a /**\x0d\x0a * 受保護的默認構造方法\x0d\x0a */\x0d\x0a protected RegSingleton() {\x0d\x0a }\x0d\x0a /**\x0d\x0a * 靜態工廠方法,返回指定登記對象的唯一實例;\x0d\x0a * 對於已登記的直接取出返回,對於還未登記的,先登記,然後取出返回\x0d\x0a * @param name\x0d\x0a * @return RegSingleton\x0d\x0a */\x0d\x0a public static RegSingleton getInstance(String name) {\x0d\x0a if (name == null) {\x0d\x0a name = “RegSingleton”;\x0d\x0a }\x0d\x0a if (m_registry.get(name) == null) {\x0d\x0a try {\x0d\x0a m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());\x0d\x0a } catch (InstantiationException e) {\x0d\x0a e.printStackTrace();\x0d\x0a } catch (IllegalAccessException e) {\x0d\x0a e.printStackTrace();\x0d\x0a } catch (ClassNotFoundException e) {\x0d\x0a e.printStackTrace();\x0d\x0a }\x0d\x0a }\x0d\x0a return m_registry.get(name);\x0d\x0a }\x0d\x0a /**\x0d\x0a * 一個示意性的商業方法\x0d\x0a * @return String\x0d\x0a */\x0d\x0a public String about() {\x0d\x0a return “Hello,I am RegSingleton!”;\x0d\x0a }\x0d\x0a}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/180192.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:11
下一篇 2024-11-22 05:11

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Unity3D 創建沒有 Terrain Tile 的場景

    這篇文章將會介紹如何在 Unity3D 中創建一個沒有 Terrain Tile 的場景,同時也讓讀者了解如何通過編程實現這個功能。 一、基礎概念 在 Unity3D 中,Terr…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論