單例模式是指整個應用中類只有一個對象實例的設計模式。它一般被用來建立對象,確保某個類只有一個實例,並且自行實例化並向整個系統提供這個實例。php
它是一種常見的設計模式,在計算機系統中,線程池、緩存、日誌對象、對話框、打印機、數據庫操做、顯卡的驅動程序常被設計成單例。redis
一個類在整個應用中有且只有一個實例數據庫
類必須自行建立這個實例設計模式
必須自行向整個系統提供這個實例緩存
使用單例模式最大的做用就是能減小系統開銷,節約資源。好比咱們在使用php進行平常開發中,常常須要屢次鏈接MySQL或redis等各類關係型、非關係型數據庫,若是不使用單例模式,則需屢次進行new建立新的實例,都會消耗大量的內存資源和系統資源。函數
一、須要一個保存類的惟一實例的靜態成員變量this
private static $_instance;
二、構造函數和克隆函數必須聲明爲私有,防止外部程序new類從而失去單例模式的意義線程
// 私有化構造方法,防止new實例 private function __construct() { $this->_db = pg_connect('demo'); } // 覆蓋__clone()方法,禁止克隆 private function __clone() { }
三、必須提供一個訪問這個實例的公共的靜態方法(一般爲getInstance方法),從而返回惟一實例的一個引用設計
// 用於返回對象實例的公共靜態方法 public static function getInstance() { // 判斷當前實例是否已經建立 if (!(self::$_instance instanceof self) ) { // 若是沒有,則建立 self::$_instance = new self(); } // 最終返回實例 return self::$_instance; }
下面我就以一個MySQL操做類爲例給你們演示下它的寫法。調試
代碼:
<?php /** * Class DB 數據庫操做類 */ class Db { private $_db; private static $_instance; // 私有化構造方法,防止外部new實例 private function __construct(...) { // 這裏主要用於鏈接數據庫,細節此處省略 $this->_db = pg_connect(...); } // 覆蓋__clone()方法,禁止克隆 private function __clone() { } // 返回對象實例 public static function getInstance() { // 判斷是否存在對象實例 if(! (self::$_instance instanceof self) ) { // 不存在則建立保存 self::$_instance = new self(); } // 返回對象實例 return self::$_instance; } // 其餘方法 public function addUserInfo(...) { } // 其餘方法 public function getUserInfo(...) { } } // 演示 $db = Db::getInstance(); $db->addUserInfo(...); $db->getUserInfo(...);
講了這麼多單例模式的內容,可不是說它沒有缺點哦,下面我列出了使用單例模式的優缺點,你們看下,能夠根據實際需求選擇使用。
單例模式的優缺點:
改進系統的設計
是對全局變量的一種改進
節省系統資源開銷
難於調試
隱藏的依賴關係
沒法用錯誤類型的數據覆寫一個單例