国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

淺入理解單例模式

CoyPan / 2531人閱讀

摘要:實現我們在這里引入了一個私有的構造函數,這樣,外部就無法實例化這個對象了。對于這個類,我們無法生成第二個對象,因為它的構造函數是私有的,并且方法是私有的,而且,在判斷已經有了一個實例的情況下默認返回該實例。這就是單例模式。

問題 惱人的全局變量

在 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 方法來獲取具體的實例,而無法去覆寫它,這就達成了第二個目標。

由于 $instancegetInstance 都是靜態的,所以我們可以通過 Preference::getInstance() 訪問,具體的實例。這樣就使得全局都可以訪問到它了,它就像全局變量一樣了,這就達成了第一個目標了。

對于這個類,我們無法生成第二個對象,因為它的構造函數是私有的,并且 __clone 方法是私有的,而且,getInstance 在判斷已經有了一個實例的情況下默認返回該實例。這就達成了第三個目標了。

同時,我們也盡量避免序列化這個實例,所以我們給 __wakeup__sleep 這兩個魔術方法私有。

這就是單例模式。

后記

對于單例模式,其實沒有那么高大上。只不過是更改的對象的訪問范圍,以及對象始終存在,僅此而已。

最后,本文章是作者在學習設計模式時的感想。部分參考自《深入 PHP 面向對象、模式與實踐(第 3 版)》。如有錯誤,感謝大神不吝賜教。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30679.html

相關文章

  • javascript知識點

    摘要:模塊化是隨著前端技術的發展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調也不等同于異步。將會討論安全的類型檢測惰性載入函數凍結對象定時器等話題。 Vue.js 前后端同構方案之準備篇——代碼優化 目前 Vue.js 的火爆不亞于當初的 React,本人對寫代碼有潔癖,代碼也是藝術。此篇是準備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評論0 收藏0
  • vuex淺入淺出

    摘要:來自不同視圖的行為需要變更同一狀態。圖解后端的行為,響應在上的用戶輸入導致的狀態變化。中的非常類似于事件每個都有一個字符串的事件類型和一個回調函數。 什么是Vuex? Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。 Vuex采用和Redux類似的單向數據流的方式來管理數據。用戶...

    琛h。 評論0 收藏0
  • Java 總結

    摘要:中的詳解必修個多線程問題總結個多線程問題總結有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現集合框架 (三): 單鏈表的實現 自己實現集合框架 (三): 單鏈表的實現 基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出 由于 poi 本身只是針對于 ...

    caspar 評論0 收藏0
  • java 基礎 - 收藏集 - 掘金

    摘要:基礎知識復習后端掘金的作用表示靜態修飾符,使用修飾的變量,在中分配內存后一直存在,直到程序退出才釋放空間。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 Java 學習過程|完整思維導圖 - 后端 - 掘金JVM 1. 內存模型( 內存分為幾部分? 堆溢出、棧溢出原因及實例?線上如何排查?) 2. 類加載機制 3. 垃圾回收 Java基礎 什么是接口?什么是抽象...

    makeFoxPlay 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<