單例模式:採取一定的方法保證在整個的軟體系統中,對某個類***只能存在乙個物件例項***,並且該類只提供乙個取得其物件例項的方法。比如:sessionfactory
① 構造器私有化
② 類的內部建立物件
③ 向外暴露乙個靜態的公共方法
2.2.1 方式一
public
class
singleton
// 2.類的內部建立物件
private
final
static singleton instance =
newsingleton()
;// 3.向外暴露乙個靜態的公共方法
public
static singleton getinstance()
}
優缺點:
① 這種寫法簡單,就是在類裝載的時候就完成了例項化,避免了在多執行緒中的同步問題。
② 在類裝載的時候就完成例項化,如果從始至終都沒有用過這個例項,則會造成記憶體的浪費。
2.2.2 方式二
public
class
singleton
// 2.類的內部建立物件
private
static singleton instance;
// 在靜態**塊中建立單例物件
static
// 3.向外暴露乙個靜態的公共方法
public
static singleton getinstance()
}
優缺點:與方式一類似,也是在類裝載的時候執行靜態**塊中的**,初始化類的例項,避免執行緒同步問題,但是也可能造成記憶體浪費。
public
class
singleton
// 懶漢式:提供乙個靜態方法,當使用該方法時才建立例項物件
public
static singleton getinstance()
return instance;
}}
public
class
singleton
// 懶漢式:提供乙個靜態方法,當使用該方法時才建立例項物件
public
static
synchronized singleton getinstance()
return instance;
}}
分析:解決了執行緒不安全的問題,但是降低了同步效率,第一次需要進行初始化,後面就可以直接return。
public
class
singleton
// 懶漢式:提供乙個靜態方法,當使用該方法時才建立例項物件
public
static singleton getinstance()
}return instance;
}}
分析:執行緒不安全,現實開發中不能這樣使用
// double check
public
class
singleton
// 提供乙個靜態方法,當使用該方法時才建立例項物件
// 加入了雙重檢查**,解決執行緒安全問題,同時解決懶載入問題,同時保證了一定的效率,推薦使用
public
static singleton getinstance()
}}return instance;
}}
**演示:
class
singleton
private
static
class
singletoninstance
public
static singleton getinstance()
}
分析:
① 當類singleton裝載的時候,靜態內部類singletoninstance不會進行裝載,只有在使用到的時候才會裝載,實現懶載入的效果。
② 當呼叫getinstance()方法的時候,裝載靜態內部類singletoninstance,jvm在裝載類的時候是執行緒安全的,所以沒有執行緒安全的問題
**演示:
public
class
singletontest
}
enum singleton
}
單例模式共八種方式:餓漢式(兩種)、懶漢式(四種,包含doublecheck)、靜態內部類、列舉
使用場景:需要頻繁的進行建立和銷毀的物件、建立物件耗時過多或者耗費資源過多(重量級物件),但是又經常需要用到的物件、工具類物件,頻繁訪問資料庫或檔案的物件(比如資料來源、session工廠等)。
23種設計模式 1單例模式
1.單例模式 singleton pattern 是一種簡單的設計模式,它的定義如下 為了確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。2.通用 如下 class singleton 通過該方法獲得例項化物件 public static songleton getinstance...
23種設計模式 (1)單例模式
定義確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項 單例模式優點 單例模式的缺點 單例模式為什不能增加介面?因為對介面對單例模式沒有任何意義,它要求 自行例項化 並提供單一例項,介面或者抽象類不可能被例項化單例的使用場景 在乙個系統中,要求類有且僅有乙個物件,如果出現多個物件會有 不...
23種設計模式 單例模式
某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...