通常來說,類別和物件(類別的實例)之間是一對多的關係。但是某些情況下,我們只
需要一個類別的一個實例。例如多個實例的多樣性反倒會帶來一些不可控因素,多
次的實例化,是一種資源的浪費,降低了效率;又如他們是工廠物件(factory
object),用來創建系統中的其他對象,等等。這時候,較好的處理方式就是讓類別
的實例具有單一性:保障這個類別在運作過程中最多產生一個實例( Singleton 模
式),或是讓所有的實例保持一致( Monostate 模式)。
PHP下實作Singleton 模式範例:
<?php classSingleton { privatestatic$instance; privatefunction__construct() { } publicstaticfunctioninstance() { if(self::$instance==null) { self::$instance=newSingleton(); } returnself::$instance; } } ?>
建立singleton 類別實例就只能夠是這樣了:
$instance=Singleton::instance(); // 这样是错误的: $instance = new Singleton();
詳細分析一下PHP 下實現的singleton 模式的特徵:
1. 一個正確分析一下PHP 下實現的singleton 模式的特徵:
也能夠被類別方法呼叫, private 保證它不被類別的實例等改變。
2. 一個 private 的建構方法:不允許該類別在本類別之外的地方實例化。
法可以不被實例化即可被呼叫。
跟下面的 monostate 比,它的優點在於:
2. 可以統購派生創建,給定一個類,可以創建它的一個 singleton 子類。
缺點:
1. singleton 特性不能夠被繼承,其子類別就不是 singleton 類別了。
new 來實例化。
例一樣。實際上把類別的所有屬性都使用 static 聲明即可:
<?php classmonostate { privatestatic$itsX=0; publicfunction__construct() { } publicfunctionsetX($x) { self::$itsX=$x; } publicfunctiongetX() { returnself::$itsX; } } ?>