PHP設計模式之單例模式

Master_Kang發表於2020-11-04

定義:簡單的說,整個應用中只有一個例項物件的設計模式

1、單例模式的要點:

  • 建構函式需要標記為private(訪問控制:防止外部程式碼使用new操作符建立物件),單例類不能在其他類中例項化,只能被其自身例項化;
  • 擁有一個儲存類的例項的靜態成員變數
  • 擁有一個訪問這個例項的公共的靜態方法(常用getInstance()方法進行例項化單例類,通過instanceof操作符可以檢測到類是否已經被例項化)

簡單的記為三私一公一關鍵:

  • 公共靜態方法(public static function getInstance()),用來訪問靜態屬性儲存的物件,如果沒有物件,則生成此單例
  • 私有靜態屬性(privite static $instance),又來儲存生成的唯一物件
  • 私有建構函式 (privite __contruct()),構造方法私有化,防止外部建立例項
  • 私有克隆函式(privite function __clone()),防止克隆——clone
  • 關鍵詞instanceof,檢查此變數是否為該類的物件、子類、或是實現介面。

2、為什麼要使用PHP單例模式?

  • php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作,** 使用單例模式, 則可以避免大量的new 操作消耗的資源。**
  • 如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現。
    class Singleton{
    //私有屬性,用於儲存例項
    private static $instance;
    //構造方法私有化,防止外部建立例項
    private function __construct(){}
    //公有屬性,用於測試
    public $a;
    //公有方法,用於獲取例項
    public static function getInstance(){
        //判斷例項有無建立,沒有的話建立例項並返回,有的話直接返回
        if(!(self::$instance instanceof self)){
            self::$instance = new self();
        }
        return self::$instance;
    }
    //克隆方法私有化,防止複製例項
    private function __clone(){}
    }

測試:
首先建立兩個例項:

`$first = Singleton::getInstance();`
`$second = Singleton::getInstance();`

給第一個例項中的$a屬性賦值,並列印兩個例項

$first->a = "zs";
echo "<pre>";
print_r($first);
print_r($second);

列印結果為:

給第二個賦值,並列印:

$first->a = "zs";
$second->a = "ls";
echo "<pre>";
print_r($first);
print_r($second);

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章