摘要:總之,我認為單例模式有最重要的兩點,保證唯一以及節(jié)省資源。單例模式為了能夠保持運行期間唯一并能夠被全局訪問,污染了全局變量。
定義
單例模式(Singleton pattern):一個類有且僅有一個實例,并且自行實例化后提供給整個程序使用。
或者可以理解為在整個程序運行期間,保證這個類有且僅一個實例,并對外提供一個能夠訪問它的全局訪問點。
應用場景對于一個程序來說,某些特殊的類在程序運行期間僅僅保證只被實例化一次很重要。打印服務是單例模式出鏡率比較高的一個例子,對于打印機同一時刻只能打印一個文件,因此出現(xiàn)兩個打印服務實例的時候,肯定有一個是處于閑置狀態(tài)浪費資源,如果沒有閑置,那么就會發(fā)生資源爭奪情況,你肯定不會希望一頁紙上交替打印了兩個文檔吧。
當你打算實現(xiàn)一個框架的時候,如果你是這么思考的,我要先寫一個核心,其它的諸如框架配置、控制器、視圖、類庫等等都和這個核心有關聯(lián),這個核心從一接到請求就開始運行,一直到請求結束,所有的其它的組件都由核心來實例化,這個核心就像一個樹干一樣,其它的組件都像一條條樹枝掛在主干上,那么這個核心類最好用單例模式,這時候你所加載的配置,你所實例化的各個組件,在本次運行期間就很確定的是由這一個核心實例化出來的(因為沒有別的啦),那么不論你怎么玩也就不會發(fā)生 A 實例下的配置信息被 B 實例調用了。
總之,我認為單例模式有最重要的兩點,保證唯一以及節(jié)省資源。
實現(xiàn)方法把構造方法用 private 方式隱藏起來,可以防止被其它類 new 出來。
沒了構造方法了,那么其它類不能 new 出來這個類了,那么只能自食其力自己 new 自己了,然而有個問題,此時自己是不存在的啊,不存在又怎么運行自己 new 自己的方法呢?
因此要使用靜態(tài)方法,靜態(tài)方法可以使用類直接調用,在靜態(tài)方法中 new 自己,因為是在類里,所以可以無視 private 。
雖然 new 出來了,但是不保存起來的話,下次再需要時,不是還需要 new 一次 ,那么也就不是單例了,因此要找個安全的地方存起來,而靜態(tài)方法只能訪問靜態(tài)的屬性,因此把 new 出來的對象放到靜態(tài)屬性里吧。
class Singleton { private static $_instance;//保存實例化出來的單例 //構造函數(shù)私有化,確保單例類不能通過其它對象 new 出來 private final function __construct() {} //定義私有的__clone()方法,這是確保單例類不能被復制或克隆,否則又不是單例了。 private function __clone() {} public static function getInstance() { //檢測類是否被實例化,如果沒有實例化,就 new 一下,已經(jīng)實例化就直接返回。 if ( ! (self::$_instance instanceof self) ) { self::$_instance = new test(); } return self::$_instance; } } //拿到單例實例,多次調用都是同一個實例 Singleton::getInstance();優(yōu)點
提供了對唯一實例達到受控訪問。
由于在系統(tǒng)內(nèi)存中只存在一個對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
缺點單例模式破壞了常見的類模式以及沒有抽象層,因擴展時有很大的困難。
單例模式為了能夠保持運行期間唯一并能夠被全局訪問,污染了全局變量。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25649.html
摘要:單例模式模式系列的開篇,首先介紹的是我最喜歡的單例模式,簡單而言,這屬于生成一個且只生成一個對象實例的特殊類。問題良好設計的系統(tǒng)通過方法調用傳遞對象實例。面向對象設計模式目錄 單例模式 模式系列的開篇,首先介紹的是我最喜歡的單例模式(Singleton),簡單而言,這屬于:生成一個、且只生成一個對象實例的特殊類。 這個唯一存在的類,將替代Global關鍵字,并且更安全。 產(chǎn)生前提 全局...
摘要:上面是簡單的單例模式,自己寫程序的話夠用了,如果想繼續(xù)延伸,請傳送至大話設計模式之單例模式升級版 看了那么多單例的介紹,都是上來就說怎么做,也沒見說為什么這么做的。那小的就來說說為什么會有單例這個模式以便更好的幫助初學者真正的理解這個設計模式,如果你是大神,也不妨看完指正一下O(∩_∩)O首先我不得不吐槽一下這個模式名字單例,初學者通過字面很難理解什么是單例,我覺得應該叫唯一模式更貼切...
摘要:大佬看完如果發(fā)現(xiàn)鄙人理解有誤請立即指出,感謝拍磚,跪求鞭打單例單元素模式實現(xiàn)來自說明通過提供對自身共享實例對訪問,單元素單例設計模式用于限制特定對象只能被創(chuàng)建一次。 整理一下自己的學習Aaron Saray 寫的PHP設計模式一些demo和自己的理解。大佬看完如果發(fā)現(xiàn)鄙人理解有誤請立即指出,感謝拍磚,跪求鞭打 /** * Singleton 單例(單元素)模式實現(xiàn) * -----...
閱讀 3834·2021-09-27 13:56
閱讀 881·2021-09-08 09:36
閱讀 765·2019-08-30 15:54
閱讀 609·2019-08-29 17:29
閱讀 927·2019-08-29 17:21
閱讀 1683·2019-08-29 16:59
閱讀 2757·2019-08-29 13:03
閱讀 2964·2019-08-29 12:47