模式設計是什麼?初學者一開始會被這高大上的名稱給唬住。而對於有豐富程式設計經驗的老鳥來說,模式設計又是無處不在。很多接觸的框架就是基於各種模式設計形成的。 簡單說,在寫程式碼的過程中一開始往往接觸的是程式導向的,簡單的基礎的程式設計。這個時候我們往往追求的是程式碼能夠實現某項功能就萬事大吉。管他程式碼多麼冗餘,管他程式碼是否可重用,管他效率如何,能實現功能就好。但是,真正應用於實際的,更被大家採納的是那些高效的,可重用的,便於團隊開發的程式碼。基於這些因素,你不能像練手一樣,隨便命名函式名,隨便放置指令碼。模式設計告訴是給人們組織程式碼提供一種思路,實現可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。
在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。
什麼是單例模式?
根據這個名稱,我們很容易瞭解到,單例模式指的是在整個應用中只有一個物件例項的設計模式。
為什麼要用單例模式?
php常常和資料庫打交道,如果在應用中如果頻繁建立連線物件,進行new操作的話,會消耗大料的系統記憶體資源,這並不是我們希望看到的。再則,在團隊合作專案中,單例模式可以有效避免不同程式設計師new自己的物件,造成人為的系統消耗。
如何建立單例模式?
在看到這個問題的時候,相信優秀的程式設計師很可能自己試著根據要求去建立單例模式,而不是坐等前人的經驗。區別於其他博友告訴你什麼樣的模式是單例模式,我人更願意和有物件導向程式設計基本經驗的你考慮一下如何自己建立單例模式。
我們首先從題目出發,單例模式是隻有一個物件例項的設計模式。這一點是很讓人蛋疼的。我們平常建立的類不是能建立很多物件的,就是不能建立物件的(抽象類)。要建立物件需要有類這是必須的,而且不能是抽象類。這個類要防止別人可以多次建立函式。我們自然而然考慮到了從建構函式入手。但是,每次new操作都會呼叫建構函式,也就是會多次建立物件例項。這和我們設計初衷相悖了。在此處務必申明建構函式為private或者protected這樣才能解決這個問題。
建構函式被申明為private或者protected這注定無法通過new的方法建立例項物件了。而且我們發現,經過這一步處理後,解決問題的前景變得明朗起來了。為什麼呢?既然無法通過new方法建立物件例項,那麼我們只能通過類內的方法來建立物件例項了。 這個時候我們面臨一個有趣的先有雞還是先有蛋的問題。我們往往往往是建立了物件後才呼叫物件的方法,而此時需要呼叫類裡面的方法來建立物件。不受是否建立物件影響都能呼叫的方法的解決方案毋庸置疑那就是利用關鍵字--static。
在類內建立靜態方法完成完成什麼工作呢?迴歸主題:確保只建立一個例項物件。如何確保只有一個呢?這很簡單,if判斷一下啊。存在的話直接返回,不存在自己建立一個嘛。當然這個例項物件是類的靜態屬性。至此,單例模式要求的功能實現完成。真的完成了麼?還不算~如果有個類繼承本類,將構造方法申明為public那不又壞事兒了?那有必要在構造方法前加final關鍵字了。
最後貼上單例模式程式碼,程式碼解釋都在上面了~~
<?php class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->hash=rand(1,9999); } static public function getInstance(){ if (self::$ins instanceof self) { return self::$ins; } self::$ins=new self(); return self::$ins; } }
本身單例模式並不複雜,但需要深入理解。很多初學者依舊會感嘆:臥槽,構造方法原來不一直是public啊~臥槽還可以不通過new建立物件啊~其實筆者想說,不管構造方法被申明為public,private還是protected,最終建立物件的時候都會呼叫。一直是new建立物件例項,單例模式也用new建立物件,只是換個地方而已,從類外到類內。
最後對研究出各種精妙的模式設計的程式設計師表示拜服~~
系列文章: