設計模式(二)單件模式Singleton(建立型)

2022-05-18 08:56:03 字數 2247 閱讀 5864

singleton(單件)—物件建立型模式

幾乎所有物件導向的程式中,總有一些類的物件需要是唯一的,例如,通過資料庫控制代碼到資料庫的連線是獨佔的。您希望在應用程式中共享資料庫控制代碼,因為在保持連線開啟或關閉時,它是一種開銷。再如大家最經常用的im,如qq,在同一臺電腦,乙個帳號只能有唯一的登入。

1. 問題

怎樣確保乙個特殊類的例項是獨一無二的(它是這個類的唯一例項),並且這個例項易於被訪問呢?

2. 解決方案

1)全域性變數:乙個全域性變數使得乙個物件可以被訪問,但它不能防止你例項化多個物件。因為你的任何**都能修改全域性變數,這將不可避免的引起更多除錯的意外。換句話說,全域性變數的狀態總是會出現一些問題的。

2)類建構函式私有和類自身的靜態方法:讓類自身負責儲存它的唯一例項(靜態變數)。這個類可以保證沒有其他例項可以被建立(通過擷取建立新物件的請求) ,並且它可以提供乙個訪問該例項的方法(靜態方法)。這就是singleton模式。

3. 適用性

在下面的情況下可以使用單件模式

1)當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。

2)當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**就能使用乙個擴充套件的例項時。

4. 實現:

uml結構:

**:

<?php 

class singleton

/*** 靜態方法將建立這個例項的操作並保證只有乙個例項被建立

* * @return unknown

*/public static function getinstance()

return self::$_instance;

}}

5. 效果

singleton模式有許多優點

1)  對唯一例項的受控訪問, 因為singleton類封裝它的唯一例項,所以它可以嚴格的控制客戶怎樣以及何時訪問它。

2)  縮小名空間,singleton模式是對全域性變數的一種改進。它避免了那些儲存唯一例項的全域性變數汙染名空間。

3)  允許對操作和表示的精化singleton類可以有子類,而且用這個擴充套件類的例項來配置乙個應用是很容易的。你可以用你所需要的類的例項在執行時刻配置應用。

4)  允許可變數目的例項 這個模式使得你易於改變你的想法,並允許singleton類的多個例項。此外,你可以用相同的方法來控 制應用所使用的例項的數目。只有允許訪問 singleton例項的操作需要改變。

6 .單件模式可以多個例項

單件模式並不是說乙個類只能只有乙個例項。假設我們使用在乙個web 請求或者程序裡面。乙個使用者id對應的某個類只能有唯一的例項。在下面的例子中,我們的user類,可以有多個例項,每個例項對應乙個uid. 例項列表註冊到靜態變數$_instance並和uid關聯起來。最簡單的例子是我們前面提到的qq,在同一臺電腦,可以使用多帳號登入,

但乙個帳號只能有唯一的登入.

**:

<?php 

class user

/*** 靜態方法將建立這個例項的操作並保證只有乙個例項被建立

* * @return unknown

*/public static function getinstance($uid = 0)

return self::$_instance[$uid];

}}

應用

在zend framework中的zend_controller_front

前端控制器,就是採用單價模式來設計的:

zend_controller_front是zend_controller_controller體系的組織者,它是frontcontroller設計模式的實現。

zend_controller_front處理伺服器接受的所有請求,並最後負責將請求分配給actioncontroller(zend_controller_action) 

$frontcontroller = zend_controller_front::getinstance();

$frontcontroller->addmoduledirectory( 「引數」);

$frontcontroller->dispatch();

Java設計模式 單例模式(single)

目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...

設計模式 單件模式

1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...

設計模式 單件模式

2015年1月29日16 02 59 單件模式是用來保證共有資源唯一性的設計模式,舉個例子吧,假如我們是藝人,我們在同乙個經紀人的協助下開展工作,我們可以委託這個經紀人做一些事情,但是我們不能委託經紀人在幫你做報表的同時幫我訂外賣。用程式猿的語言來表達就是,我們可能在多處地方持有對同一資源的引用。由...