繼承單例模式 php PHP設計模式之單例模式

2021-10-22 22:52:38 字數 1671 閱讀 4803

單例模式,就是保持乙個物件只存在乙個例項。並且為該唯一例項提供乙個全域性的訪問點(一般是乙個靜態的getinstance方法)。單例模式應用場景非常廣泛,例如:資料庫操作物件

日誌寫入物件

全域性配置解析物件

這些場景的共同特徵是從業務邏輯上來看執行期間改物件卻是只有乙個例項

不斷new多個例項會增加不必要的資源消耗

全域性呼叫便利

下面分別說明這三個方面:

1. 業務上只需要乙個例項

,那麼在乙個程序中無論我們需要進行多少次針對改資料庫的操作,都只需要連線資料庫一次,使用相同的資料庫連線控制代碼(mysql connection resource),從業務需求上來看就只需要乙個例項。

相反,同樣以購物**為例,存在許多商品,這些商品都不一樣(id,name,price..),這個時候需要顯示乙個商品列表,加入我們建立乙個product

作為資料對映物件,那麼從業務需求上來說,乙個例項就無法滿足業務需求,因為每個商品都不一樣。

2. 不斷new操作增加不必要的資源消耗

我們一般會在類的構造方法(new操作肯定會呼叫)中進行一些業務操作,例如資料庫連線物件可能會在構造方法中嘗試讀取資料庫配置並進行資料庫連線(如mysqli::__construct())、日誌寫入物件會判斷日誌寫入目錄是否存在並寫入(不存在可能嘗試建立改目錄)、全域性配置解析物件可能需要定位配置檔案的儲存目錄並進行檔案掃瞄等。

這些業務都會消耗相當的資源,如果在乙個程序中我們值需要做一次,將會非常有利於我們提高應用的執行效率。

3. 全域性呼叫便利

因為單例模式的一大特點就是通過靜態方法獲取物件例項,那麼就意味著訪問物件的方法時不需要先new乙個物件的例項,如果改物件需要很多地方使用,則提高了呼叫的便利性。

通過乙個日誌操作類來舉例:

class logger:::";

if (empty(self::$instances[$key])){

//這裡也可以用 new self(); 的方式

$class = __class__;

self::$instances[$key] = new $class($host, $username, $password, $dbname, $port);

return self::$instances[$key];

//過載__clone方法,不允許物件例項被轉殖

public function __clone(){

throw new exception("singleton class can not be cloned");

//查詢業務方法,後面省略其它業務方法

public function query($sql){

return $this->conn->query($sql);

//盡早釋放資源

public function __destruct(){

$this->conn->close();

問題1:單例類能否擁有子類,因為單例類的構造方法是私有的,因此無法被繼承,如果要繼承則需要將構造方法改為protected或public,這就違背了單例模式的本意。因此,如果你想給單例類加子類,那就需要回頭想想是否錯用了模式,或者結構設計上有問題。

問題2:單例濫用,單例模式相對來說比較好理解和實現,因此一旦認識到單例模式的好處,很可能什麼類都想寫成單例,因此在使用次模式之前一定要考慮上述3種情況,看是否真的有必要使用。

Headfirst java設計模式 單例模式

單例 件 模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。實現 1.懶漢式 通過延遲例項化實現的單例模式 使用synchronized處理多執行緒訪問,但是效能較差。public class lazyinstantiazesingleton public static synchronized...

java設計模式 Singleton單例模式

餓漢模式 package singleton created by anshay on 2017年10月14日 email anshaym 163.com 型別 餓漢模式 public class singleton 2.建立類的唯一例項,使用private static修飾 private不允許外...

JAVA設計模式 SINGLETON單例模式

概念 單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例模式只應在有真正的 單一例項 的需求時才可使用 例子 public class singletona private static singletona s public static singletona geti...