設計模式之單例模式

2021-07-11 19:26:49 字數 2500 閱讀 6314

我在看開源**時,時不時會驚嘆,這怎麼寫的。那麼完美,層層遞進,行雲流水,我什麼時候才能寫出這樣詩畫般的**。

接著我就踏上了設計模式的學習之路。設計模式很多,比如抽象工廠模式,建造者模式,

裝飾模式,觀察者模式,介面卡模式,單例模式等等

第一彈,設計模式之單例模式

單例模式是設計模式中最簡單的,最簡單的,最簡單的

單例模式的意義:

我們現在想像乙個場景  :  有乙個印表機類,物理硬體就只有乙個,(哈哈。我們實驗室就只有一台印表機。)如果在多個地方new出例項,並且是同時執行列印操作,那麼列印出來的東西,就不僅僅是你的東西了,可能上面是別人的,緊接著才是你的,也就是東西會混在一起。

這種情況,乙個類的物件只需要乙個,如果有多個例項會造成衝突

單例模式就是確保乙個類只有乙個例項,並提供乙個全域性訪問點

可以參考下圖

singleton類,有乙個static靜態變數uniqueinstance;私有的構造方法,和靜態的getinstance()方法

這裡封閉了構造方法,那麼外部就無法使用構造方法來產生例項了。接著getinstance()這個提供給外部呼叫的靜態方法用於獲取唯一的例項uniqueinstance

乙個很標準的單例模式模型**如下

public class singleton;

public static singleton getinstance()else }}

接下來進行**演示,巧克力工廠專案

public class chocolatefactory

//填滿材料

public void fill()

}//倒出煮沸的巧克力

public void drain()

} //煮沸

public void boid()}}

就乙個大鍋用來煮巧克力,假設建立了兩個巧克力工廠物件,當乙個物件執行裝滿巧克力材料方法後,另乙個物件再次呼叫,此時empty已經被賦值為false,即鍋裡填滿了材料了

使用單例模式之後

public class chocolatefactory

public static chocolatefactory getinstance()else

} public void fill()

}public void drain()

} public void boid()}}

然而,還沒完呢

接下來是多執行緒的情況。執行緒是依據時間片來執行的。

看到下面這段**

public static chocolatefactory getinstance()else 

}

如果現在兩個執行緒,第乙個執行緒thread1的時間片到了  if(chocolatefactory == null),這裡先進行判斷,然後執行chocolatefactory = newchocolatefactory();剛好在執行這段**的時候,突然間時間片切換到第二個執行緒thread2,thread2也是執行這段**,因為上乙個時間片的時候,new建立物件還沒有完成,指標還是為空。那麼這個時候還是會new出乙個物件。總的下來,兩個執行緒就獲取到了兩個巧克力工廠物件,這是多執行緒不安全性的很好的體現

方法1:加上同步鎖   

synchronized關鍵字

public static synchronized chocolatefactorygetinstance()else 

}

這時,thread1執行建立物件時,如果時間片切換到thread2,因為執行緒thread1持有同步鎖,執行緒2無法執行。這是要等到時間片再次切換到執行緒1, thread1執行完釋放出同步鎖後thread2才能繼續執行。同步鎖消耗資源比較多。

方法2:急切建立例項

public class chocolatefactory

}

看到private static chocolatefactorychocolatefactory = new chocolatefatory();

那麼這個程式一開始執行就直接建立了這個物件,物件個數恒為1

方法3:雙重檢查加鎖

public static chocolatefactory getinstance()

} }

return chocolatefactory;

}

這個方法也很好理解,就是同步鎖住了一片區域,

synchronized(chocolatefactory.class)

}

較之簡單粗暴的方法1,這種方法同步只會執行一次,消耗的資源比較少

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...