問(wèn)題:
- 需要一個(gè)對(duì)象可以被系統(tǒng)中的任何對(duì)象使用
- 對(duì)象不能被隨意被覆蓋
- 系統(tǒng)不能有超過(guò)一個(gè)該對(duì)象
實(shí)現(xiàn):
class Preferences {
private $props = array();
private static $insance;
private function __construct() {}
public static function getInstance()
{
if (empty(self::$instance)){
self::$instance = new Preferences();
}
return self::$instance;
}
public function setProperty($key, $val)
{
$this->props[$key] = $val;
}
public function getProperty($key)
{
return $this->props[$key];
}
}
由于構(gòu)造函數(shù)是private
的惑朦,所以并不能從外部實(shí)例化這個(gè)對(duì)象递宅,然后通過(guò)getInstance方法生成一個(gè)唯一的對(duì)象并返回,這樣用戶(hù)就不能通過(guò)外部修改對(duì)象,而且由于getInstance方法是一個(gè)static
方法叽粹,所以在腳本的任何地方都可以被調(diào)用炭菌。
調(diào)用示例:
$pref = Preferences::getInstance();
$pref->setProperty('name', 'testName');
unset($pref); // 移除引用
$pref2 = Preferences::getInstance();
echo pref2->getProperty('name'); // 輸出testName罪佳, 屬性并沒(méi)有因?yàn)閡nset而丟失
單例模式示意圖:
優(yōu)缺點(diǎn)對(duì)比:
優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|
作為全局變量的改進(jìn),讓使用者不能使用錯(cuò)誤的類(lèi)型覆蓋單例 | 和全局變量一樣黑低,可能會(huì)被誤用 |
- | 調(diào)試?yán)щy |
以上內(nèi)容來(lái)自對(duì)《深入php:面向?qū)ο笞秆蕖⒛J脚c實(shí)踐》中“單例模式”的總結(jié)