單例模式,即某個類只有一個實例。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。
對于系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重復對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個對象的唯一性即一個類只能有一個實例非常重要。
顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的公有的函數用于創建或獲取它本身的靜態私有對象。
在PHP中實現單例模式的源代碼如下一種形式:
1 <?php
2 /**
3 * 單例模式
4 *
5 * 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點
6 *
7 */
8 class Singleton
9 {
10 staticprivate$_instance=null;
11
12 privatefunction __construct()
13 {
14 }
15
16 staticpublicfunction getInstance()
17 {
18 if(is_null(self::$_instance)) {
19 self::$_instance=new Singleton();
20 }
21 return self::$_instance;
22 }
23
24 publicfunction display()
25 {
26 echo"it is a singlton class function";
27 }
28 }
29
30 // $obj = new Singleton(); // 聲明不能成功
31 $obj= Singleton::getInstance();
32 var_dump($obj);
33 $obj->display();
34
35 $obj1= Singleton::getInstance();
36 var_dump(($obj===$obj1));
新聞熱點
疑難解答