首頁  >  文章  >  後端開發  >  PHP設計模式之單例模式

PHP設計模式之單例模式

高洛峰
高洛峰原創
2016-11-15 13:39:021040瀏覽

簡介

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

它是一種常見的設計模式,在電腦系統中,執行緒池、快取、日誌物件、對話方塊、印表機、資料庫操作、顯示卡的驅動程式常被設計成單例。

特徵

一個類別在整個應用中有且只有一個實例

類必須自行創建這個實例

必須自行向整個系統提供這個實例

作用

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

總結

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

單例模式的優缺點:

優點:

改進系統的設計

是對全域變數的改良

節省系統資源開銷

無法用錯誤類型的資料覆寫一個單例

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn