設計模式-單例模式

設計模式-單例模式

單例模式是Java中最簡單的設計模式之一,在Java語言中單例模式的定義:“一個類有且只有一個實例,並且自行實例化後向整個系統提供”。

在Java中實現單例模式需要注意以下三點:

一、是單例模式的類只提供私有的構造函數。

二、是類定義中含有一個該類的靜態私有對象,。

三、是該類提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象。

我們先來簡單的實現一個單例模式。

<code>public class SingletonDemo {
\tprivate SingletonDemo() {
\t}
\tprivate static volatile SingletonDemo instance = null;
\tpublic static SingletonDemo getInstance() {
\t\tif(null == instance) {
\t\t\tsynchronized (SingletonDemo.class) {
\t\t\t\tif(null == instance) {
\t\t\t\t\tinstance = new SingletonDemo();
\t\t\t\t}
\t\t\t}
\t\t}
\t\treturn instance;
\t}
}/<code>

上面是一個使用雙檢鎖的方式實現的一個單例模式,使用synchronized 和volatile關鍵字確保第一次創建時沒有因為線程間的互相競爭而產生多個實例。該方式在多線程的情況下能確保安全且性能相對較高。除了雙檢鎖,還有其它多種方式來實現單例,下面就讓我們簡單瞭解一下。

懶漢式是實現單例模式的最簡單的方式,在多線程的情況下懶漢式根據方法是否添加synchronized 關鍵字判斷是否線程安全。在多數的開發過程中大都使用這種方式實現單例。

<code>public class SingletonDemo {
\tprivate SingletonDemo() {
\t}
\tprivate static SingletonDemo instance = null;
\tpublic static synchronized SingletonDemo getInstance() {
\t\tif(null == instance) {
\t\t\tinstance = new SingletonDemo();
\t\t}
\t\treturn instance;
\t}
}/<code>

餓漢式是實現單例的第三種模式,這種模式下類加載時就創建了實例對象。這種代碼在我們工作中能經常看到。

<code>public class SingletonDemo {
\tprivate SingletonDemo() {
\t}
\tprivate static volatile SingletonDemo instance = new SingletonDemo();
\tpublic static SingletonDemo getInstance() {
\t\treturn instance;
\t}
\t
}/<code>

實現單例的方式還有登記式,這種方式使用靜態內部類實例化對象,和餓漢式一樣利用classloader的機制保證初始化時只有一個線程。

<code>public class SingletonDemo {
\tprivate SingletonDemo() {
\t}
\tprivate static class SingletonDemoHolder {

\t\tprivate static final SingletonDemo INSTANCE = new SingletonDemo();
\t}
\tpublic static final SingletonDemo getInstance() {
\t\treturn SingletonDemoHolder.INSTANCE;
\t}
}/<code>

除此之外Java中的枚舉也是實現單例的一種很好的方法,但是這種方式在開發過程中使用的比較少,多數情況下我們會把這些枚舉數據保存到數據庫中,這樣可以動態配置。


分享到:


相關文章: