java中的單例模式
❶ 單例模式介紹和使用場景及Spring單例模式的使用
1.什麼是單例模式單例模式(SingletonPattern)是java中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
提供了對唯一實例的受控訪問
由於系統中內存只存在一個對象,因此可以節約系統的的資源,對於一些頻繁的創建和銷毀的對象單例模式無意可以提供系統的性能
單例模式可以允許可變的數目的實例,使用單利模式進行擴展,使用控制單利對象相似的方法獲取指定個數的實例,及解決了單利對象,共享過多,而有損性能的問題
2.2單例模式的缺點由於單例模式,不是抽象的所以可擴展性比較差
職責過重,在一定程度上違背了單一職責
濫用單例將帶來一些負面的問題,如為了節省資源將資料庫連接池對象設計為單例模式,可能會導致共享連接池對象的程序過多未出而出現的連接池溢出,如果實例化對象長時間不用系統就會被認為垃圾對象被回收,這將導致對象狀態丟失
2.3單例模式的使用場景開發工具類庫中的很多工具類都應用了單例模式,比例線程池、緩存、日誌對象等,它們都只需要創建一個對象。
3.單例模式的12種寫法3.1餓漢式(靜態變數)publicclassSingleton{=newSingletion();privateSingletion(){}(){returninstance;}}3.2餓漢式(靜態常量)publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}3.3餓漢式(靜態代碼塊)publicclassSingleton{;static{instance=newSingleton();}privateSingleton(){}(){returninstance;}}上面三種寫法本質上其實是一樣的,也是各類文章在介紹餓漢式時常用的方式。但使用靜態final的實例對象或者使用靜態代碼塊依舊不能解決在反序列化、反射、克隆時重新生成實例對象的問題。序列化:一是可以將一個單例的實例對象寫到磁碟,實現數據的持久化;二是實現對象數據的遠程傳輸。當單例對象有必要實現Serializable介面時,即使將其構造函數設為私有,在它反序列化時依然會通過特殊的途徑再創建類的一個新的實例,相當於調用了該類的構造函數有效地獲得了一個新實例!
3.4懶漢式(線程不安全)publicclassSingleton{;privateSingleton(){}(){if(instance==null){instance=newSingleton();}returninstance;}}3.5懶漢式(線程安全,存在同步開銷)classSingleton{privatestaticSingletonintance=null;privateSingleton(){//私有構造函數}(){if(intance==null){intance=newSingleton();}returnintance;}}3.6懶漢式(線程假裝安全,同步代碼塊)classSingleton{;privateSingleton(){}(){if(singleton==null){//4.加入同步代碼塊synchronized(Singleton.class){singleton=newSingleton();}}returnsingleton;}}3.7DCL「雙重檢測鎖:DoubleCheckedLock」(假)publicclassSingleton{;privateSingleton(){}(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}}3.8DCL「雙重檢測鎖:DoubleCheckedLock」單例(真)publicclassSingleton{;privateSingleton(){}(){if(instance==null){synchronized(Singleton.class){instance=newSingleton();}}returninstance;}}3.9靜態內部類(推薦使用)publicclassSingleton{privateSingleton(){}(){=newSingleton();}(){returnSingletonInstance.INSTANCE;}}3.10枚舉類單例模式publicenumSingleton{INSTANCE;privateResourceinstance;Singleton(){instance=newResource();}publicResourcegetInstance(){returninstance;}publicstaticclassResource{privateResource(){}}}3.11登記式單例--使用Map容器來管理單例模式publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}03.12內部枚舉類publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}14.Spring依賴注入對單例的使用在AbstractBeanFactory中
publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}24.1doGetBean中{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}34.2getSingleton的實現返回在給定名稱下注冊的(原始)單例對象,檢查已經實例化的單例並允許提前對當前創建的單例的引用(解析循環引用)。
publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}4作者:ZhangSan_Plus
❷ 什麼是單例模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。
通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。
單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一實例。
要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,「阻止」所有想要生成對象的訪問。
使用工廠方法來限制實例化過程。這個方法應該是靜態方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義。
(2)java中的單例模式擴展閱讀:
優缺點:
優點
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用。
參考資料:網路---單例模式
❸ Java常用的幾種設計模式
下面給你介紹5種設計模式:
1.單例設計模式
所謂單例設計模式簡單說就是無論程序如何運行,採用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟如下:
(1) 將採用單例設計模式的類的構造方法私有化(採用private修飾)。
(2) 在其內部產生該類的實例化對象,並將其封裝成private static類型。
(3) 定義一個靜態方法返回該類的實例。
2.工廠設計模式
程序在介面和子類之間加入了一個過渡端,通過此過渡端可以動態取得實現了共同介面的子類實例化對象。
3.代理設計模式
指由一個代理主題來操作真實主題,真實主題執行具體的業務操作,而代理主題負責其他相關業務的處理。比如生活中的通過代理訪問網路,客戶通過網路代理連接網路(具體業務),由代理伺服器完成用戶許可權和訪問限制等與上網相關的其他操作(相關業務)。
4.觀察者設計模式
所謂觀察者模式,舉個例子現在許多購房者都密切觀察者房價的變化,當房價變化時,所有購房者都能觀察到,以上的購房者屬於觀察者,這便是觀察者模式。
java中可以藉助Observable類和Observer介面輕松實現以上功能。當然此種模式的實現也不僅僅局限於採用這兩個類。
5.適配器模式
如果一個類要實現一個具有很多抽象方法的介面,但是本身只需要實現介面中的部分方法便可以達成目的,所以此時就需要一個中間的過渡類,但此過渡類又不希望直接使用,所以將此類定義為抽象類最為合適,再讓以後的子類直接繼承該抽象類便可選擇性的覆寫所需要的方法,而此抽象類便是適配器類。
❹ java 單例模式這個要怎麼理解
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
注意:
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
介紹
意圖:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
主要解決:一個全局使用的類頻繁地創建與銷毀。
何時使用:當您想控制實例數目,節省系統資源的時候。
如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。
關鍵代碼:構造函數是私有的。
應用實例:
1、一個班級只有一個班主任。
2、Windows 是多進程多線程的,在操作一個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象,所以所有文件的處理必須通過唯一的實例來進行。
3、一些設備管理器常常設計為單例模式,比如一個電腦有兩台列印機,在輸出的時候就要處理不能兩台列印機列印同一個文件。
優點:
1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。
2、避免對資源的多重佔用(比如寫文件操作)。
缺點:沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來實例化。
使用場景:
1、要求生產唯一序列號。
2、WEB 中的計數器,不用每次刷新都在資料庫里加一次,用單例先緩存起來。
3、創建的一個對象需要消耗的資源過多,比如 I/O 與資料庫的連接等。
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多線程同時進入造成 instance 被多次實例化。