聲明:文章內容根據大牛博客的內容,自己理解後,給自己做的學習筆記,文末會附上大牛博客地址鏈接。有需要溝通交流的可加我QQ羣:425120333
說真的,看懂設計模式了,和會用,在這之間還差了N行代碼,每個設計模式都是前人經驗的結晶,先去理解再去用(千萬別在代碼中強行使用)。
首先,就是單例模式,顧名思義,就是一個類在整個運行期間只會有一個實例,每次獲取到的都是同一實例。實現單例模式的方式各種各樣,
每種方式都有各自的特點,需要根據實際情況進行選擇。
/**
* @author caiqibin
* @introduce:類被調用就創建(可能只是用到類中其他的靜態方法),可能浪費空間
*
*/
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getSingleton() {
return singleton;
}
}
/**
* @author caiqibin
* @introduce:單線程下可行,多線程下不能保證單例
*
*/
class SingletonA {
private static SingletonA singleton;
private SingletonA() {
}
public static SingletonA getSingleton() {
if (singleton == null) {
singleton = new SingletonA();
}
return singleton;
}
}
/**
* @author caiqibin
* @introduce:多線程下也可行,但是加了同步,多了很多等待,浪費時間
*
*/
class SingletonB {
private static SingletonB singleton;
private SingletonB() {
}
public synchronized static SingletonB getSingleton() {
if (singleton == null) {
singleton = new SingletonB();
}
return singleton;
}
}
/**
* @author caiqibin
* @introduce:雙重檢測校驗,一般來說都可以,而且不會有問題。
* 創建對象三步走:1分配內存空間,2初始化構造器,3將對象指向分配的內存地址(因爲jvm的指令重排序
* ,2、3的順序無法保證)所以導致可能出現問題
*/
class SingletonC {
private static SingletonC singleton;
private SingletonC() {
}
public static SingletonC getSingleton() {
if (singleton == null) {
synchronized (SingletonC.class) {
if (singleton == null) {
singleton = new SingletonC();
}
}
}
return singleton;
}
}
/**
* @author caiqibin
* @introduce:一定不會有問題(要jdk1.5以上才支持volatile關鍵字)
*
*/
class SingletonD {
private static volatile SingletonD singleton;
private SingletonD() {
}
public static SingletonD getSingleton() {
if (singleton == null) {
synchronized (SingletonD.class) {
if (singleton == null) {
singleton = new SingletonD();
}
}
}
return singleton;
}
}
/**
* @author caiqibin
* @introduce:最好的實現方式,沒有限制,不會浪費
*
*/
class SingletonBest {
private SingletonBest() {
}
public static SingletonBest getSingleton() {
return CreateSingletonBest.singleton;
}
private static class CreateSingletonBest {
private static SingletonBest singleton = new SingletonBest();
}
}
這裏我總共列出了6中,最後這種是最優的,而且沒限制。當然,實際情況下還有其他寫單例的方法,水平有限,還知道其他的請給我留言學習下,謝謝了!
參考大牛博客鏈接:http://www.cnblogs.com/zuoxiaolong/p/pattern2.html