概念
wiki百科:單例模式,也叫單子模式,是一種常用的軟件設(shè)計模式。 在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在。 許多時候整個系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。
通俗的說,也就是對于某一個功能只能實例化一個對象。
應(yīng)用場景
實際項目中像數(shù)據(jù)庫查詢,日志輸出,全局回調(diào),統(tǒng)一校驗等模塊。這些模塊功能單一,但需要多次訪問,如果能夠全局唯一,多次復(fù)用會大大提升性能。
單例模式的好處
1:減少頻繁創(chuàng)建,節(jié)省了cpu。
2:靜態(tài)對象公用,節(jié)省了內(nèi)存。
3:功能解耦,代碼易維護(hù)。
如何設(shè)計單例
通過上面的描述,單例的核心是,實例一次生成,全局唯一,多次調(diào)用。因此在單例模式必須包含三要素:
1:私有化構(gòu)造函數(shù),私有化clone。也就是不能new,不能clone?!疚ㄒ弧?br>
2:擁有一個靜態(tài)變量,用于保存當(dāng)前的類?!疚ㄒ蝗绾伪4妗?br>
3:提供一個公共的訪問入口?!究梢栽L問】
代碼實現(xiàn)
<?php
class Singleton
{
// 保存實例的靜態(tài)對象
public static $singleInstance;
// 私有化構(gòu)造方法
private function __construct()
{
}
// 私有化clone方法
private function __clone()
{
}
/**
* 聲明靜態(tài)調(diào)用方法
* 目的:保證該方法的調(diào)用全局唯一
*/
public static function getInstance()
{
if (!self::$singleInstance) {
self::$singleInstance = new self();
### 或者這樣寫 self::$_instance = new Singleton();
}
return self::$singleInstance;
}
// 調(diào)用單例的方法
public function singletonFunc()
{
echo "call single ton method";
}
}
$singleInstance = Singleton::getInstance();
$singleInstance->singletonFunc();
$singleInstance2 = Singleton::getInstance();
$singleInstance2->singletonFunc();
// 校驗是否是一個實例
var_dump($singleInstance === $singleInstance2); // true ,一個對象