單例模式很顯然是定義乙個類,這個類在程式中只有唯一的例項物件。一般單例類的建構函式是私有的,只能通過呼叫靜態函式getinstance來獲取例項。
一、單例模式有三種:懶漢式單例、餓漢式單例、登記式單例(利用j**a內部類的概念)。
1.懶漢式單例
publicclass
singleton //
此類不能被例項化
public
static
synchronized singleton getinstance()
return
singleton;
}}
優點:第一次呼叫才初始化,避免記憶體浪費。
缺點:如果兩個執行緒同時呼叫getinstance方法,會出現兩個單例,必須加鎖同步才能保證單例,但加鎖會影響效率。
2.餓漢式單例
publicclass
singleton //
此類不能被例項化
public
static
singleton getinstance()
}
優點:沒有加鎖,執行效率會提高。
缺點:類載入時就初始化,浪費記憶體。
3.登記式單例
publicclass
singleton //
構造方法是私有的,從而避免外界利用構造方法直接建立任意多例項。
public
static
singleton getinstance()
private
static
class
holder
}
內部類只有在外部類被呼叫才載入,產生單例,又不用加鎖。此模式有上述兩個模式的優點,遮蔽了它們的缺點,是最好的單例模式。(內部類好像只是j**a中的概念,c++中不存在)
二、單例模式的優缺點
優點:1.提供了對唯一例項的受控訪問。
2.由於在系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件,單例模式可以提高系統的效能。
3.允許可變數目的例項。(不懂)
缺點:1.單例模式中沒有抽象,因此單例類的擴充套件有很大的困難。
2.單例類的職責過重,在一定程度上違背了「單一職責原則」。
3.濫用單例將帶來一些負面問題,如為了節省資源將資料庫連線池物件設計為的單例類,可能會導致共享連線池物件的程式過多而出現連線池溢位;如果例項化的物件長時間不被利用,系統會認為是垃圾而被**,這將導致物件狀態的丟失。(沒遇到過)
三、單例模式使用場景
1.需要頻繁例項化然後銷毀的物件。
2.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。
3.有狀態的工具類物件。
4.頻繁訪問資料庫或檔案的物件。
例如:參考:
Java設計模式之單例模式(Singleton)
前言 在總結okhttp的時候,為了管理網路請求使用到了單例模式,晚上實在沒啥狀態了,靜下心來學習總結一下使用頻率最高的設計模式單例模式。單例模式 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例特點 單例分類 1 懶漢單例 1 非執行緒安全實現 public class...
設計模式 建立型模式 單例模式 Singleton
4種單例模式 單執行緒單例 類class single private static single sin null public static single createinstance return sin 呼叫 console.writeline 單執行緒單例模式 single sin sin...
大話設計模式二十一 單例模式(Singleton)
一.單例模式定義 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。二.結構和說明 singleton負責建立singleton類自己的唯一例項,並提供乙個getinstance方法,讓外部來訪問這個類的唯一例項。三.呼叫示例圖 實現 四.控制例項個數 簡單演示如何擴充套件單例模式,控制例項數...