/** * 單例模式,顧名思義強調的是單一,只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體。 * * 建立型模式 * 條件3點 * 1、需要一個靜態變數,儲存類的唯一執行個體。 * 2、需要一個公用靜態方法,返回唯一執行個體的一個引用。 * 3、建構函式(__construct)、複製函數(__clone)私人化,從而防止外部程式 new 類,從而失去單例模式的意義。 * * 優點: * 1、節省系統資源,避免重複執行個體化,是一種“計劃”生育。 * 2、避免大量的new 操作。例如,資料庫應用。一個系統程式,會存在大量的資料庫操作,如果使用單例模式,就可以避免大量new 操作。 * 3、如果系統中需要一個類來全域控制某些配置資訊,那麼使用單例模式可以很方便的實現。這個可以參看zend framework 的frontController部分。 * 4、便於調試,管理,因為所有代碼 都集中在一個類裡。我們可以在類中設定鉤子,輸出日誌,從而避免 到處 var_dump,echo * * 缺點: * 眾所周知,php語言是一種解釋型指令碼語言,這種運行機制使得每個php頁面被解釋執行後,所有的相關資源都會被收回。也就是說,php在語言層級上沒辦法使某個對象常駐記憶體。 * 這與asp.net、java等編譯型是不同的。然而php,所有的變數無論是全域變數還是靜態變數,靜態成員都是頁面級的。 * 每次頁面執行時,都會重建立立新的對象,都會在頁面執行完畢後被清空。 * 這樣似乎php單例模式沒什麼意義了,所以php的單例模式是針對單次頁面級同時出現多個應用情境並需要共用同一對象資源時,是非常有意義的。 * */class singleton {private static $_instance = null;public static function getInstance() {if (self::$_instance == null) {self::$_instance = new self();}return self::$_instance;}/** * 構造方法聲明為private,防止直接建立對象。 * */private function __construct() {}/** * 複製方法聲明為private,防止複製對象執行個體。 * */private function __clone() {}}$instance = singleton::getInstance();var_dump($instance);//$error = new singleton();//$error = clone $instance;
擴充知識
1、單例模式 兩職責。
管理自己的執行個體,自行執行個體。
提供全域訪問點
2、一個類應該職責單一,是否違法oo 設計原則?
單例模式,是有兩個職責。由類管理自己的執行個體的做法並不少見。這可以讓整體設計更簡單。許多開發人員都已經熟悉了單例模式的做法。
設計模式目錄