單例模式(Singleton Pattern):顧名思義,就是隻有一個實例。做爲對象的建立模式,單例模式確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。php
單例模式指的是在整個應用中只有一個對象實例的設計模式。數據庫
php的應用主要在於數據庫應用, 一個應用中會存在大量的數據庫操做, 在使用面向對象的方式開發時, 若是使用單例模式,則能夠避免大量的new 操做消耗的資源,還能夠減小數據庫鏈接這樣就不容易出現 too many connections狀況。設計模式
若是系統中須要有一個類來全局控制某些配置信息, 那麼使用單例模式能夠很方便的實現. 這個能夠參看zend Framework的FrontController部分。函數
在一次頁面請求中, 便於進行調試, 由於全部的代碼(例如數據庫操做類db)都集中在一個類中, 咱們能夠在類中設置鉤子, 輸出日誌,從而避免處處var_dump, echo設計
①、私有靜態屬性,用來儲存生成的惟一實例調試
②、私有構造函數, 用來建立並只容許建立一個實例日誌
③、私有克隆函數,防止克隆——clonecode
④、公共靜態方法,用來訪問靜態屬性儲存的對象,若是沒有對象,則生成此單例對象
note: 三私一公內存
class Single { static protected $instance; //防止被直接建立 final protected function __construct() { } //防止克隆對象 private function __clone() { } static public function getInstance() { if (self::$instance instanceof self) { return self::$ins; } self::$instance=new self(); return self::$instance; }
之前實例都是經過new來建立對象實例,單例模式也用new建立對象,只是換個地方而已,從類外到類內。
構造函數被申明爲private或者protected這注定沒法經過new的方法建立實例對象了。,
實例控制:單例模式會阻止其餘對象實例化其本身的單例對象的副本,從而確保全部對象都訪問惟一實例。
靈活性:由於類控制了實例化過程,因此類能夠靈活更改實例化過程。
開銷:雖然數量不多,但若是每次對象請求引用時都要檢查是否存在類的實例,將仍然須要一些開銷。能夠經過使用靜態初始化解決此問題。
可能的開發混:使用單例對象(尤爲在類庫中定義的對象)時,開發人員必須記住本身不能使用new關鍵字實例化對象。由於可能沒法訪問庫源代碼,所以應用程序開發人員可能會意外發現本身沒法直接實例化此類。
對象生存期:不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類可以致使實例被取消分配,由於它包含對該實例的私有引用。在某些語言中(如 C++),其餘類能夠刪除對象實例,但這樣會致使單例類中出現懸浮引用。