天天看點

Java單例模式

單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一執行個體。要實作這一點,可以從用戶端對其進行執行個體化開始。是以需 要用一種隻允許生成對象類的唯一執行個體的機制,“阻止”所有想要生成對象的通路。使用工廠方法來限制執行個體化過程。這個方法應該是靜态方法(類方法),因為讓 類的執行個體去生成另一個唯一執行個體毫無意義。

要點:

顯然單例模式的要點有三個;一是某個類隻能有一個執行個體;二是它必須自行建立這個執行個體;三是它必須自行向整個系統提供這個執行個體。

從具體實作角度來說,就是以下三點:一是單例模式的類隻提供私有的構造函數,二是類定義中含有一個該類的靜态私有對象,三是該類提供了一個靜态的公有的函數用于建立或擷取它本身的靜态私有對象。

示例:

第一種形式:懶漢式,也是常用的形式。

<code>public</code> <code>class</code> <code>SingletonClass{</code>

<code>    </code><code>private</code> <code>static</code> <code>SingletonClass instance=</code><code>null</code><code>;</code>

<code>    </code><code>public</code> <code>static</code><code>synchronized</code><code> SingletonClass getInstance()</code>

<code>    </code><code>{</code>

<code>        </code><code>if</code><code>(instance==</code><code>null</code><code>)</code>

<code>        </code><code>{</code>

<code>               </code><code>instance=</code><code>new</code> <code>SingletonClass();</code>

<code>        </code><code>}</code>

<code>        </code><code>return</code> <code>instance;</code>

<code>    </code><code>}</code>

<code>    </code><code>private</code> <code>SingletonClass(){</code>

<code>}</code>

第二種形式:餓漢式

<code>//對第一行static的一些解釋</code>

<code>// java允許我們在一個類裡面定義靜态類。比如内部類(nested class)。</code>

<code>//把nested class封閉起來的類叫外部類。</code>

<code>//在java中,我們不能用static修飾頂級類(top level class)。</code>

<code>//隻有内部類可以為static。</code>

<code>public</code> <code>static</code> <code>class</code> <code>Singleton{</code>

<code>    </code><code>//在自己内部定義自己的一個執行個體,隻供内部調用</code>

<code>    </code><code>private</code> <code>static</code> <code>final Singleton instance = </code><code>new</code> <code>Singleton();</code>

<code>    </code><code>private</code> <code>Singleton(){</code>

<code>        </code><code>//do something</code>

<code>    </code><code>//這裡提供了一個供外部通路本class的靜态方法,可以直接通路</code>

<code>    </code><code>public</code> <code>static</code> <code>Singleton getInstance(){</code>

第三種形式: 雙重鎖的形式。

<code>    </code><code>private</code> <code>static</code> <code>Singleton instance=</code><code>null</code><code>;</code>

<code>        </code><code>if</code><code>(instance==</code><code>null</code><code>){</code>

<code>            </code><code>synchronized(Singleton.</code><code>class</code><code>){</code>

<code>                </code><code>if</code><code>(</code><code>null</code><code>==instance){</code>

<code>                    </code><code>instance=</code><code>new</code> <code>Singleton();</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

繼續閱讀