PHP 設計模式之一 單例模式

2021-09-16 13:04:43 字數 1337 閱讀 5526

單例模式(singleton pattern):乙個類有且僅有乙個例項,並且自行例項化後提供給整個程式使用。

或者可以理解為在整個程式執行期間,保證這個類有且僅乙個例項,並對外提供乙個能夠訪問它的全域性訪問點。

對於乙個程式來說,某些特殊的類在程式執行期間僅僅保證只被例項化一次很重要。列印服務是單例模式出鏡率比較高的乙個例子,對於印表機同一時刻只能列印乙個檔案,因此出現兩個列印服務例項的時候,肯定有乙個是處於閒置狀態浪費資源,如果沒有閒置,那麼就會發生資源爭奪情況,你肯定不會希望一頁紙上交替列印了兩個文件吧。

當你打算實現乙個框架的時候,如果你是這麼思考的,我要先寫乙個核心,其它的諸如框架配置、控制器、檢視、類庫等等都和這個核心有關聯,這個核心從一接到請求就開始執行,一直到請求結束,所有的其它的元件都由核心來例項化,這個核心就像乙個樹幹一樣,其它的元件都像一條條樹枝掛在主幹上,那麼這個核心類最好用單例模式,這時候你所載入的配置,你所例項化的各個元件,在本次執行期間就很確定的是由這乙個核心例項化出來的(因為沒有別的啦),那麼不論你怎麼玩也就不會發生 a 例項下的配置資訊被 b 例項呼叫了。

總之,我認為單例模式有最重要的兩點,保證唯一以及節省資源。

把構造方法用 private 方式隱藏起來,可以防止被其它類 new 出來。

沒了構造方法了,那麼其它類不能 new 出來這個類了,那麼只能自食其力自己 new 自己了,然而有個問題,此時自己是不存在的啊,不存在又怎麼執行自己 new 自己的方法呢?

因此要使用靜態方法,靜態方法可以使用類直接呼叫,在靜態方法中 new 自己,因為是在類裡,所以可以無視 private 。

雖然 new 出來了,但是不儲存起來的話,下次再需要時,不是還需要 new 一次 ,那麼也就不是單例了,因此要找個安全的地方存起來,而靜態方法只能訪問靜態的屬性,因此把 new 出來的物件放到靜態屬性裡吧。

class singleton 

//定義私有的__clone()方法,這是確保單例類不能被複製或轉殖,否則又不是單例了。

private function __clone() {}

public static function getinstance()

return self::$_instance;

}}//拿到單例例項,多次呼叫都是同乙個例項

singleton::getinstance();

優點

提供了對唯一例項達到受控訪問。

由於在系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件單例模式無疑可以提高系統的效能。

缺點單例模式破壞了常見的類模式以及沒有抽象層,因擴充套件時有很大的困難。

單例模式為了能夠保持執行期間唯一並能夠被全域性訪問,汙染了全域性變數。

設計模式之一單例模式

單例模式就是類別只有乙個例項,每次在必得類呼叫這個類的例項,都是同乙個例項。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。如印表機 顯示卡等等這些系統資源。如果做andr...

設計模式之一 單例模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。定義乙個單例類,使用類的私有指標變數指向類的唯一例項,並且使用乙個共有的靜態方法獲取該例項。懶漢模式 即第一次呼叫該類的例項的時候才產生乙個新的該...

設計模式之一 單例模式

一.什麼是單例模式 某個類同時保留乙個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。二.單例模式的特點 1.單例模式只能有乙個例項。2.單例類必須建立自己的唯一例項。3.單例類必須向其他物件提供這一例項。三.單例模式vs靜態類 在知道了什麼是單例模式後,我想你一定會想到靜態類,既然只使用...