單例模式是軟件設計模式中最簡單,使用頻次最高的設計模式之一。
其目的是:
確保某一個類在系統中只有一個實例(對象)。
應用場景:
- PHP主要的是與數據庫進行交互,需要大量的使用數據庫操作類,使用單例模式可以避免大量的new 數據庫類消耗系統資源。
- 某些應用中需要用一個類來加載配置信息,使用單例模式就會非常方便。
- 在一次頁面請求中,便于進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日志,從而避免到處var_dump, echo。
代碼實現
一般情況下的數據庫操作類:
Database.php
<?php
class Database{
//數據庫連接操作
}
?>
index.php
<?php
class Index{
$db = new Database(); //new出我們需要的數據庫連接實例
}
?>
使用這種方式進行數據庫連接,在每一個文件中都需要去new一個數據庫實例,而實際中我們只需連接一次就可以了。所以這種方式造成了不必要的資源浪費。
使用單例模式
Database.php
<?php
class Database{
protect $db;
//定義一個私有的構造方法
private __construct(){
}
static public dataCo(){
if(self::$db){
return self::$db;
}
self::$db = new self();
return self::$db
}
}
?>
index.php
<?
php
class Index{
$db = Database::dataCon();
}
?>
使用單例模式創建的數據庫連接類,無論你在其他文件中實例多少個數據庫連接實例,其實都是一個。
PHP創建工廠模式的步驟:
1.定義一個私有的構造方法。(使類在其他文件中不能通過New來實例化)
private __construct(){ }
2.定義靜態方法來實例化本身(在內部進行判斷,如實例已經存在直接返 回,如不存在則new出本身并返回)
static public dataCo(){
if(self::$db){
return self::$db;
}
self::$db = new self();
return self::$db
}
3.通過靜態方法實例化
$db = Database::dataCon();
其實在一般使用時為了防止對象被克隆還會添加一個__clone
方法。