簡介
單例模式是指整個應用中類別只有一個物件實例的設計模式。它通常被用來創建對象,確保某個類別只有一個實例,並且自行實例化並向整個系統提供這個實例。
它是一種常見的設計模式,在電腦系統中,執行緒池、快取、日誌物件、對話方塊、印表機、資料庫操作、顯示卡的驅動程式常被設計成單例。
特徵
一個類別在整個應用中有且只有一個實例
類必須自行創建這個實例
必須自行向整個系統提供這個實例
作用
使用單例模式最大的作用就是能減少系統開銷,節約資源。例如我們在使用php進行日常開發中,常常需要多次連接MySQL或redis等各種關係型、非關係型資料庫,如果不使用單例模式,則需多次進行new建立新的實例,都會消耗大量的記憶體資源和系統資源。
要點
1、需要一個保存類別的唯一實例的靜態成員變數
private static $_instance;
2、建構子和克隆函數必須聲明為私有,防止外部程式new類別從而失去單例模式的意義
// 私有化构造方法,防止new实例 private function __construct() { $this->_db = pg_connect('demo'); } // 覆盖__clone()方法,禁止克隆 private function __clone() { }
3、必須提供一個存取這個實例的公共的靜態方法(通常為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(...);
總結
講了這麼多單例模式的內容,可不是說它沒有缺點哦,下面我列出了使用單例模式的優缺點,大家看下,可以根據實際需求選擇使用。
單例模式的優缺點:
優點:
改進系統的設計
是對全域變數的改良
節省系統資源開銷
無法用錯誤類型的資料覆寫一個單例