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

  幾乎所有面向對象的程序中,總有一些類的對象需要是唯一的,例如,通過數據庫句柄到數據庫的連接是獨占的。您希望在應用程序中共享數據庫句柄,因為在保持連接打開或關閉時,它是一種開銷。再如大家最經常用的IM,如QQ,在同一臺電腦,一個帳號只能有唯一的登錄。

1. 問題

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

2. 解決方案

1)全局變量:一個全局變量使得一個對象可以被訪問,但它不能防止你實例化多個對象。因為你的任何代碼都能修改全局變量,這將不可避免的引起更多調試的意外。換句話說,全局變量的狀態總是會出現一些問題的。

2)類構造函數私有和類自身的靜態方法:讓類自身負責保存它的唯一實例(靜態變量)。這個類可以保證沒有其他實例可以被創建(通過截取創建新對象的請求) ,并且它可以提供一個訪問該實例的方法(靜態方法)。這就是Singleton模式。

3. 適用性
在下面的情況下可以使用單件模式
1)當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。

2)當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。

4. 實現:

UML結構:

1.jpg

代碼:

<?php  
class  Singleton {  
    static  private  $_instance = null;//靜態成員保存唯一實例  
    /** 
     * 私有構造函數,保證不能被外部訪問 
     * 
     */  
    private function __construct() {}   
    /** 
     * 靜態方法將創建這個實例的操作并保證只有一個實例被創建 
     * 
     * @return unknown 
     */  
    public static function getInstance() {  
        if (!self::$_instance) {  
            self::$_instance = new self();  
        }  
        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 {  
    static  private  $_instance = array();//靜態成員保存唯一實例  
    private $_uid ;  
    /** 
     * 私有構造函數,保證不能被外部訪問 
     * 
     */  
    private function __construct($uid ) {  
        $this->_uid = $uid;  
    }   
    /** 
     * 靜態方法將創建這個實例的操作并保證只有一個實例被創建 
     * 
     * @return unknown 
     */  
    public static function getInstance($uid = 0) {  
        if (!self::$_instance || !isset(self::$_instance[$uid]) ) {  
            self::$_instance[$uid] = new self($uid);  
        }  
        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();

轉自:http://blog.csdn.net/hguisu/article/details/7515416

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2949

(0)
s19930811s19930811
上一篇 2015-06-24
下一篇 2015-06-25

相關推薦

  • class-6 積累應用

    1、三種權限rwx對文件和目錄的不同意義     ## 讀寫執行對于文件的意義         r:針對于文本文件         w:可修改內容,但不能刪除文件本身,需要x權限配合  &n…

    Linux干貨 2016-08-05
  • LVM——如何讓你的磁盤空間可大可小

    邏輯卷管理器(LVM) 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小 允許在多個物理設備間重新組織文件系統          將設備指定為物理卷          用一個或者多個物理卷來創…

    Linux干貨 2016-08-29
  • 集中練習3

    用戶管理、文本處理、文件管理相關

    2017-09-20
  • Linux Bash Shell有關變量

    bash 創建一個子bash-n 查看是否有錯誤-x 逐行顯示信息$:顯示當前PIDPPID :顯示父進程PIDSHLVL :顯示當前shell是幾級shellpstree 顯示進程樹-p 同時顯示進程號ps -ef 顯示進程信息 本地變量 :僅對當前SHELL有效,對子SHELL也無效環境變量:對當前SHELL及子SHELL均有效。 set 顯示本地變量和…

    2017-09-16
  • 第二周作業

    課后作業 1.Linux上的文件管理類命令都有哪些,其常用的使用方法及相關示例演示。 cp:復制命令 三種常用方式: cp[OPTION]…[-T] SOURCE DEST cp[OPTION]…SOURCE…DIRECTORY cp[OPTION]…-t DIRECTORY SOURCE 如果SRC是…

    Linux干貨 2016-12-10
  • 馬哥教育網絡第21期-第1周課程練習

    第一周博客 1、描述計算機的組成及其功能。 計算機的組成:運算器、控制器、儲存器、輸入設備、輸出設備 運算器+控制器 = CPU 儲存器 = RAM(內存) I/O(輸入/輸出)設備 = 硬盤、打印機、鼠標、鍵盤、顯示器 CUP:運算和邏輯運算 儲存器:緩存和儲存數據 I/O設備:計算機與用戶交互的設備 2、按系列羅列Linux的發行版,并描述不同發行版之間…

    Linux干貨 2016-06-26
欧美性久久久久