首頁  >  文章  >  後端開發  >  php模式設計之 單例模式

php模式設計之 單例模式

WBOY
WBOY原創
2016-07-30 13:30:291194瀏覽

  模式設計是什麼?初學者一開始會被這高大上的名稱給唬住。而對於有豐富程式經驗的老鳥來說,模式設計又是無所不在。很多接觸的框架是基於各種模式設計而形成的。 簡單說,在寫程式碼的過程中一開始往往接觸的是面向過程的,簡單的基礎的程式設計。這時候我們往往追求的是程式碼能夠實現某項功能就萬事大吉。管他程式碼多麼冗餘,管他程式碼是否可重用,管他效率如何,能實現功能就好。但是,真正應用於實際的,更被大家採納的是那些高效的,可重用的,便於團隊開發的程式碼。基於這些因素,你不能像練手一樣,隨便命名函數名,隨便放腳本。模式設計告訴是給人們組織程式碼提供一個思路,實現可重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 

  在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。

什麼是單例模式?

  根據這個名稱,我們很容易了解到,單例模式指的是整個應用中只有一個物件實例的設計模式。

為什麼要用單例模式?

php常常和資料庫打交道,如果在應用中如果頻繁建立連接對象,進行new操作的話,會消耗大料的系統記憶體資源,這並不是我們希望看到的。再則,在團隊合作專案中,單例模式可以有效避免不同程式設計師new自己的對象,造成人為的系統消耗。

 如何建立單例模式?

  在看到這個問題的時候,相信優秀的程式設計師很可能自己試著根據要求去創建單例模式,而不是坐等前人的經驗。有別於其他博友告訴你什麼樣的模式是單例模式,我人更願意和有物件導向程式設計基本經驗的你考慮一下如何自己建立單例模式。

  我們先從題目出發,單例模式是只有一個物件實例的設計模式。這一點是很讓人蛋疼的。我們平常創建的類別不是能創建很多物件的,就是不能創建物件的(抽象類別)。要建立物件需要有類別這是必須的,而且不能是抽象類別。這個類別要防止別人可以多次創建函數。我們自然而然地考慮到了從構造函數入手。但是,每次new操作都會呼叫建構函數,也就是會多次建立物件實例。這和我們設計初衷相悖了。在此務必申明建構函式為private或protected這樣才能解決這個問題。

  建構子被申明為private或protected這注定無法透過new的方法建立實例物件了。而我們發現,經過這一步處理後,解決問題的前景變得明朗起來?為什麼呢?既然無法透過new方法建立物件實例,那麼我們只能透過類別內的方法來建立物件實例了。 這時候我們面臨一個有趣的先有雞還是先有蛋的問題。我們往往往往是創建了物件後才呼叫物件的方法,而此時需要呼叫類別裡面的方法來建立物件。不受是否創建物件影響都能呼叫的方法的解決方案毋庸置疑那就是利用關鍵字--static。

  在類別內建立靜態方法完成完成什麼工作呢?回歸主題:確保只建立一個實例物件。如何確保只有一個?這很簡單,if判斷一下。存在的話直接返回,不存在自己創建一個嘛。當然這個實例物件是類別的靜態屬性。至此,單例模式要求的功能實現完成。真的完成了麼?還不算~如果有個類別繼承本類,將構造方法申明為public那不又壞事兒了?那有必要在構造方法前面加final關鍵字了。

  最後貼上單例模式代碼,程式碼解釋都在上面了~~

<?<span>php
</span><span>class</span><span> Single{
    </span><span>public</span><span>$hash</span><span>;
    </span><span>static</span><span>protected</span><span>$ins</span>=<span>null</span><span>;
    </span><span>final</span><span>protected</span><span>function</span><span> __construct(){
        </span><span>$this</span>->hash=<span>rand</span>(1,9999<span>);
    }

    </span><span>static</span><span>public</span><span>function</span><span> getInstance(){
        </span><span>if</span> (self::<span>$ins</span><span> instanceof self) {
            </span><span>return</span> self::<span>$ins</span><span>;
        }
        self</span>::<span>$ins</span>=<span>new</span><span> self();
        </span><span>return</span> self::<span>$ins</span><span>;
    } 
}</span>

  本身單例模式並不復雜,但需要深入理解。很多初學者依舊會感嘆:臥槽,構造方法原來不一直是public啊~臥槽還可以不透過new創建對像啊~其實筆者想說,不管構造方法被申明為public,private還是protected,最終創建對象的時候都會呼叫。一直是new創建對象實例,單例模式也用new創建對象,只是換個地方而已,從類別外到類別內。

  最後對研究出各種精妙的模式設計的程式設計師表示拜服~~

以上就介紹了php模式設計之 單例模式,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn