2 1 單例模式

2022-05-17 21:38:40 字數 2039 閱讀 2796

皇帝與臣子

乙個類只能生成乙個物件(皇帝),其他所有類對這個物件的依賴都是同乙個,體現到**上如下:

/**

* @author: zephyr

* @description: 定義乙個私有的構造器,emperor自己可以new乙個物件,但其他類不能new當前物件,其他類只能通過靜態的getinstance方法獲取emperor物件

* @date: 2018/3/1 19:09

*/public class emperor

//靜態例項獲取

public static emperor getinstance()

public static string say()

}/**

* 每天臣子都會面對同乙個皇帝

*/class minister}}

定義:ensure a class has only one instance,and provide a global point of access to it

確保每個類只有乙個例項,自行例項化並向整個系統提供這個例項

**清單7-3

/**

* @author: zephyr

* @description: **清單7-3 單例模式通用**(餓漢式:類載入時就建立例項,執行緒安全)

* @date: 2018/3/1 19:49

*/public class hungrysingleton

//通過此方法向外部提供當前類例項

public static final hungrysingleton getinstance()

//類中的其他方法,盡量用static

//todo 為什麼盡量用static修飾?

public static void othermethod()

}

優點

缺點使用場景舉例

/**

* @author: zephyr

* @description: **清單7-4 執行緒不安全的單例(懶漢式:用到時再建立例項,執行緒不安全)

* @date: 2018/3/1 20:15

*/public class lazysingleton

//public static final 【synchronized】 lazysingleton getinstance()

return s;}}

有上限的多例模式:有固定數量例項的類。

核心邏輯:首先通過靜態**塊生成指定數量的物件存入私有列表,再通過getinstance()方法隨機返回列表中的某個物件

對應**實現如圖(**中使用了arraylist存放例項,考慮到執行緒安全問題可以使用):

/**

* @author: zephyr

* @description: **清單7-6 臣子參拜皇帝的過程(有上限的多例模式)

* @date: 2018/3/1 20:29

*/public class emperorexpend

//物件(皇帝)列表

private static listemperorlist = new arraylist();

//靜態**塊,用於產生固定數量的物件(皇帝)

static

}//隨機參見乙個皇帝

public static emperorexpend getinstance()

//皇帝發話

public string say()

}class ministerexpend}}

效果如圖:

單例模式是23個設計模式中最簡單的模式,應用也非常廣泛。spring中預設每個bean都是單例的,優點是這樣spring就可以管理這些bean的生命週期。

如果設定了非單例模式(prototype型別),則bean初始化後的管理交給j2ee容器,spring容器不再跟蹤管理這些bean的生命週期

2 1單例模式

物件資料型別的作用 把描述同乙個事物 同乙個物件 的屬性和方法放在乙個記憶體空間下,起到了分組的作用,這樣不同事物之間的屬性即使屬性名相同,相互也不會發生衝突 我們把這種分組編寫 的模式叫做 單例模式 在單例模式中我們把person1和person2也叫做 命名空間 var person1 var ...

設計模式 21 單例模式

宣告 vs2012中已經支援c 11了,因此下面的程式在vs2012中可以執行。如果版本比2012低,可能因為不支援 std mutex,std shared ptr而失敗。ifndef singleton h define singleton h include include using nam...

Chapter21 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使的乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的方法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙份訪問該例項的方法。單例模式因為...