設計模式 單例設計模式

2021-08-20 10:10:56 字數 1944 閱讀 1966

單例設計模式的最大特徵是構造方法私有化,而後在類的內部提供有乙個static本類物件,並且利用static方法取得此物件。

最簡單的單例例項:

package com.text;

class singleton //構造方法私有化

public

static singleton getinstance()

public

void

print()

}public

class testdemo

}

封裝不只是private一種形式,還包含有protected的許可權,往往出現在一些跨包的操作上

如果現在存在多個例項化物件,那麼就表示多例設計模式,就是在類的內部提供若干個物件的資訊

列舉就是多例設計模式

enum color

public string tostring()

}public

class testdemo

}

enum與enum的區別?

public

class singleton

pulic static singleton getinstance()

}

特點:餓漢式會提前進行例項化,沒有延遲載入,不管是否使用都會有乙個已經初始化的例項在記憶體中,但不會出現懶漢式中的多執行緒問題。

public

class singleton

public

static singleton getinstance()

}

特點:實現了延遲載入,但在多執行緒情況下可能會出現問題,不能保證執行緒安全。

public

class singleton

public

static sychronized singleton getinstance()

}

特點:實現了執行緒安全,但是由於synchronized限制了整個getinstance方法,而我們只是希望在new singleton()時進行加鎖,因此這種寫法會導致效率不高。於是有人提出以下寫法:

public

class singleton

public

static sychronized singleton getinstance()

return instance;

}}

思路是只需同步初始化那部分**,這就是所謂的雙檢鎖機制,很可惜這種寫法在很多平台和優化編譯器中無法編譯通過,原因在於,instance=new singleton()這行**在不同的編譯器中的行為是無法預知的,很有可能出現以下初始化情況:

變數初始化通過兩個步驟實現:1.給變數分配記憶體空間;2.呼叫建構函式來初始化成員變數。

假設執行緒a和b都在呼叫getinstance,執行緒a先進入,在執行完1步驟後被踢出了cpu,然後執行緒b進入,b看到的instance已經不是null了(記憶體已經分配),於是它開始放心大膽的使用instance,但這個是錯誤的,因為instance的成員變數還都是預設值,a還沒來得及呼叫構造方法來完成instance的初始化。

public

class singleton

private

static

class inner

public

static singleton getinstacen()

}

由於內部類在編譯完成後也是乙個單獨的class檔案,因此在不使用的情況下inner類是不會被載入的。同時,jvm保證在類載入的過程中static**塊在多執行緒或者單執行緒下都正確執行,且僅執行一次。解決了延遲載入以及執行緒安全的問題。

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...

設計模式 單例設計模式

設計模式是對問題行之有效的解決方案,它其實是一種思想。單例設計模式 解決的問題 可以保證乙個類在記憶體中只能有乙個物件。比如多個程式使用相同的配置資訊物件時,就需要保證物件的唯一性 如何保證唯一性 1 不允許其他程式用new建立類物件 2 在該類中建立乙個本類例項 3 對外提供乙個方法讓其他程式可以...