PHP設計模式之單例模式

簡介

單例模式是指整個應用中類只有一個對象實例的設計模式。它一般被用來建立對象,確保某個類只有一個實例,並且自行實例化並向整個系統提供這個實例。php

它是一種常見的設計模式,在計算機系統中,線程池、緩存、日誌對象、對話框、打印機、數據庫操做、顯卡的驅動程序常被設計成單例。redis

特色

  1. 一個類在整個應用中有且只有一個實例數據庫

  2. 類必須自行建立這個實例設計模式

  3. 必須自行向整個系統提供這個實例緩存

做用

使用單例模式最大的做用就是能減小系統開銷,節約資源。好比咱們在使用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(...);

總結

講了這麼多單例模式的內容,可不是說它沒有缺點哦,下面我列出了使用單例模式的優缺點,你們看下,能夠根據實際需求選擇使用。

單例模式的優缺點:

優勢:

  1. 改進系統的設計

  2. 是對全局變量的一種改進

  3. 節省系統資源開銷

缺點:

  1. 難於調試

  2. 隱藏的依賴關係

  3. 沒法用錯誤類型的數據覆寫一個單例

相關文章
相關標籤/搜索