設計模式-單例模式(單元素模式)
簡介
單例模式解決的是如何在整個專案中建立唯一物件例項的問題,工廠模式解決的是如何不通過new建立例項物件的方法,
您可以使用全域性變數儲存資料庫控制代碼,但是,該方法僅適用於較小的應用程式。在較大的應用程式中,應避免使用全域性變數,並使用物件和方法訪問資源。
優點
優點
一、例項控制
單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。
二、靈活性
因為類控制了例項化過程,所以類可以靈活更改例項化過程。
缺點
一、開銷
雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫原始碼,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。
三、物件生存期
不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 C++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用。。
注意事項
$_instance必須宣告為靜態的私有變數
建構函式和(解構函式:這裡目前還不知道為什麼,讀者如有知道的可以留言)必須宣告為私有,防止外部程式new 類從而失去單例模式的意義
getInstance()方法必須設定為公有的,必須呼叫此方法 以返回例項的一個引用 ::操作符只能訪問靜態變數和靜態函式
new物件都會消耗記憶體 使用場景:最常用的地方是資料庫連線。 使用單例模式生成一個物件後, 該物件可以被其它眾多物件所使用。
私有的__clone()方法防止克隆物件
實現過程
<?php
class test {
private static $_instance;//儲存類例項的私有靜態成員變數
//定義一個私有的建構函式,確保單例類不能通過new關鍵字例項化,只能被其自身例項化
private final function __construct() {
echo 'test __construct';
}
//定義私有的__clone()方法,確保單例類不能被複制或克隆
private function __clone() {}
public static function getInstance() {
echo 1;
//檢測類是否被例項化
if ( ! (self::$_instance instanceof self) ) {//判斷一個物件是否是某個類的例項
self::$_instance = new test();
}
return self::$_instance;
}
}
//呼叫單例類
test::getInstance();