什么是單例:
一個(gè)類在整個(gè)系統(tǒng)中只有一個(gè)實(shí)例,而且這個(gè)實(shí)例在類的內(nèi)部由private構(gòu)造的,外部不能直接調(diào)用其構(gòu)造方法,只能獲取它的實(shí)例.
單例模式的優(yōu)點(diǎn):
在內(nèi)存中只有一個(gè)實(shí)例對(duì)象,節(jié)省內(nèi)存空間.避免重復(fù)的創(chuàng)建和銷毀對(duì)象,可以提高性能,避免對(duì)多重資源的重復(fù)占用,可以全局進(jìn)行訪問.
單例模式的使用場(chǎng)景:
需要頻繁的實(shí)例化和銷毀的對(duì)象.有狀態(tài)的工具類對(duì)象,頻繁訪問數(shù)據(jù)庫或文件對(duì)象.
eg:(靜態(tài)內(nèi)部類)
public class SingleInstance{
? ? private static class InstanceHolder{
? ? ? ? ? ?public static final SingleInstance instance=new SingleInstance();
? ? ?}
? ? ?public static SingleInstance getInstance(){
? ? ? ? ? ? return InstanceHolder.instance;
? ?}
}
eg:(懶漢單列模式)
//懶漢單例模式,在第一次調(diào)用時(shí)候?qū)嵗约?/b>
public class Singleton {
private Singleton() {
}
private static Singleton single = null;
// 靜態(tài)工廠方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
加同步鎖可以變線程安全的單例
public static synchronized Singleton getInstance(){
if (single == null) {
single = new Singleton();
}
return single;
}
eg:餓漢單例模式
//餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態(tài)工廠方法
public static Singleton1 getInstance() {
return single;
}
}
餓漢式在類創(chuàng)建的同時(shí)就已經(jīng)創(chuàng)建好一個(gè)靜態(tài)的對(duì)象供系統(tǒng)使用上祈,以后不再改變效斑,所以天生是線程安全的亭病。
外部獲取instance實(shí)例,而不是new一個(gè)對(duì)象.
Sgingleton ?obj=Singleton.getInstance();