摘要:實現我們在這里引入了一個私有的構造函數,這樣,外部就無法實例化這個對象了。對于這個類,我們無法生成第二個對象,因為它的構造函數是私有的,并且方法是私有的,而且,在判斷已經有了一個實例的情況下默認返回該實例。這就是單例模式。
問題 惱人的全局變量
在 PHP 中,甚至不只 PHP 中,我們都會用到全局變量,以保存全局狀態。可是,往往全局變量是全局共享的,任何地方任何代碼都有可能將其覆蓋。例如,我們定義一個全局變量叫做 PHONE。我們在某一行代碼中,將其定義成了 iPhone,但是我們不小心在另一行代碼中將其覆寫成了 Nokia。這就非常的尷尬了,因為本來我們并不想它被覆寫。
繁瑣的參數傳遞在一個系統中,我們會定義許多的方法,生成很多的對象。有時候,我們會使用很多的方法,對同一個對象做操作。在不使用全局變量的情況下,我們需要將對象作為參數傳入方法中。但是這樣傳遞同一個對象,可能會造成混亂,還可能造成不必要的依賴。
其實我們只需要一個全局可訪問的對象就可以解決這個,但是全局變量又會出現我們上面的說的問題。
解決 目標我們要解決這些問題,我們對這樣的對象有下面的幾個目標。
這個對象,無論在哪里都能訪問,就想全局變量一樣。
這個對象,和全局變量不同,不能被覆寫。
這個對象,整個系統中只存在一個,對它的修改在整個系統中都能被感知到。
以上的幾個目標,就是我們所需要的,也就是單例模式的特征。
UML 實現class Preference { private static $instance; private $props = []; private __construct() {} public static function getInstance() { if (empty(self::$instance)) { self::$instance = new Preference(); } return self::$instance; } public function setProperty($key, $value) { $this->props[$key] = $value; } public function getProperty($key) { return $this->props[$key]; } private function __clone() {} private function __sleep() {} private function __wakeup() {} }
我們在這里引入了一個私有的構造函數,這樣,外部就無法實例化這個對象了。同時,我們使用 getInstance 方法來獲取具體的實例,而無法去覆寫它,這就達成了第二個目標。
由于 $instance 和 getInstance 都是靜態的,所以我們可以通過 Preference::getInstance() 訪問,具體的實例。這樣就使得全局都可以訪問到它了,它就像全局變量一樣了,這就達成了第一個目標了。
對于這個類,我們無法生成第二個對象,因為它的構造函數是私有的,并且 __clone 方法是私有的,而且,getInstance 在判斷已經有了一個實例的情況下默認返回該實例。這就達成了第三個目標了。
同時,我們也盡量避免序列化這個實例,所以我們給 __wakeup 和 __sleep 這兩個魔術方法私有。
這就是單例模式。
后記對于單例模式,其實沒有那么高大上。只不過是更改的對象的訪問范圍,以及對象始終存在,僅此而已。
最后,本文章是作者在學習設計模式時的感想。部分參考自《深入 PHP 面向對象、模式與實踐(第 3 版)》。如有錯誤,感謝大神不吝賜教。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30679.html
摘要:模塊化是隨著前端技術的發展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調也不等同于異步。將會討論安全的類型檢測惰性載入函數凍結對象定時器等話題。 Vue.js 前后端同構方案之準備篇——代碼優化 目前 Vue.js 的火爆不亞于當初的 React,本人對寫代碼有潔癖,代碼也是藝術。此篇是準備篇,工欲善其事,必先利其器。我們先在代...
摘要:基礎知識復習后端掘金的作用表示靜態修飾符,使用修飾的變量,在中分配內存后一直存在,直到程序退出才釋放空間。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 Java 學習過程|完整思維導圖 - 后端 - 掘金JVM 1. 內存模型( 內存分為幾部分? 堆溢出、棧溢出原因及實例?線上如何排查?) 2. 類加載機制 3. 垃圾回收 Java基礎 什么是接口?什么是抽象...
閱讀 3794·2021-11-17 09:33
閱讀 2011·2021-10-26 09:51
閱讀 1527·2021-09-29 09:44
閱讀 1678·2019-08-30 15:55
閱讀 1447·2019-08-30 15:52
閱讀 2325·2019-08-30 15:43
閱讀 3432·2019-08-29 17:00
閱讀 2302·2019-08-29 16:23