看了那麼多單例的介紹,都是上來就說怎麼作,也沒見說爲何這麼作的。那小的就來講說爲何會有單例這個模式以便更好的幫助初學者真正的理解這個設計模式,若是你是大神,也不妨看完指正一下O(∩_∩)O
首先我不得不吐槽一下這個模式名字「單例」,初學者經過字面很難理解什麼是單例,我以爲應該叫「惟一」模式更貼切,下面會有個人理由。再往下看以前強烈建議先搞明白PHP中「類」的概念以及實現方式。segmentfault
設計單例模式的主要目的是防止已經實例化的對象不被再次實例化(啥叫實例化?兄弟你去百度吧),好比我已經實例化了一個類,等下次我再用此類的時候,會直接返回以前實例化的結果,而不會從新實例化一個新對象。設計模式
那麼問題來了,這樣有啥好處呢?其實你機器性能無限大的時候,這種模式沒什麼卵用,有這個模式就是當代計算機原理形成的,當咱們實例化一個類的時候,電腦會分配一個內存供你使用,說到這應該明白了吧,屢次new同一個類會很浪費內存,並且與這個內存相關的東西可能都會多一份,好比說網絡鏈接數等等,總之一樣的事別麻煩同一個類,否則類也會很累。。。網絡
此時應該上代碼,典型的教科書式的代碼性能
class singleMode { //用來指向已建立好的實例 public static $instance; //判斷是否已經建立過實例 public static function getInstance() { //注意!最關鍵的代碼在這 if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } }
這就是一個簡單的單例模式,其實就是多了一個if用來判斷$instance有沒有值,有的話就直接返回$instance,沒有就實例化一個新的,這樣就避免了重複實例化的目的。
這裏還有一個比較重要的概念,我看了不少的文章都沒說起,就是static的聲明,這個也是必須的條件之一。設計
爲了能全面的理解代碼,咱們來講說static的做用,有耐心(無聊)的請往下繼續看。沒有的能夠忽略了下面了,其實單例已經說的差很少了。
這裏不得不又要說起當代計算機的原理了,來看看程序是怎麼運行的:code
當咱們編寫代碼的時候,所有內容都儲存在計算機的硬盤裏,這時什麼都沒發生,和什麼CPU,內存等都沒半毛錢關係。當程序運行時,代碼才產生做用(好像是廢話)。代碼運行到new Class的時候,計算機會分配給程序一個內存,當用完的時候內存要被回收。static的聲明讓計算機知道,這是一個靜態變量,這個變量會隨着內存分配時一併加載到內存裏,這樣程序運行的結果就被保留了下來,因此當咱們下一次訪問getInstance()這個方法時,裏面的$instance纔會有值。若是不聲明static,那麼$instance變量就不會常駐內存,而是用的時候才被賦值,這樣就沒有了繼承性。對象
回到開頭,爲何說叫「惟一」模式比較適合呢,由於單例單從字面上理解是單獨的例子,並不能說明是獨一無二的,可是惟一隻有一個是吧。繼承
上面是簡單的單例模式,本身寫程序的話夠用了,若是想繼續延伸,請傳送至大話PHP設計模式之單例模式升級版內存