皇帝與臣子
乙個類只能生成乙個物件(皇帝),其他所有類對這個物件的依賴都是同乙個,體現到**上如下:
定義:ensure a class has only one instance,and provide a global point of access to it/**
* @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}}
確保每個類只有乙個例項,自行例項化並向整個系統提供這個例項
**清單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 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使的乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的方法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙份訪問該例項的方法。單例模式因為...