PHP設計模式筆記:使用PHP實現單例模式

PHP設計模式筆記:使用PHP實現單例模式

【意圖】
保證一個類僅有一個實例,並且提供一個訪問它的全局訪問點【GOF95】
單例模式有三個特點:
1、一個類只有一個實例
2、它必須自行創建這個實例
3、必須自行向整個系統提供這個實例

【單例模式結構圖】

單例模式

【單例模式中主要角色】
Singleton 定義一個Instance操作,允許客戶訪問它的唯一實例。Instance是一個類方法。負責創建它的唯一的實例。

【單例模式的優點】
1、對唯一實例的受控訪問
2、縮小命名空間 單例模式是對全局變量的一種改進。它避免了那些存儲唯一實例的全局變量污染命名空間
3、允許對操作和表示的精華 單例類可以有子類。而且用這個擴展類的實例來配置一個應用是很容易的。你可以用你所需要的類的實例在運行時刻配置應用。
4、允許可變數目的實例(多例模式)
5、比類操作更靈活

【單例模式適用場景】
1、當類只能有一個實例而且客戶可以從一個衆所周知的訪問點訪問它時
2、當這個唯一實例應該是通過子類化可擴展的。並且用戶應該無需更改代碼就能使用一個擴展的實例時。

【單例模式與其它模式】
工廠模式:單例模式使用工廠模式來提供自己的實例。
抽象工廠模式:抽象工廠模式可以使用單例模式,將具體工廠類設計成單例類。
建造模式:建造模式可以將具體建造類設計成單例模式。
……

【單例模式PHP示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
/**
 * 單例模式 2010-06-06 sz
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥學社成員(http://www.blog-brother.com/)
 * @package design pattern
 */
 
/**
 * 懶漢式單例類
 */
class Singleton {
 
    /**
     * 靜態成品變量 保存全局實例
     */
    private static  $_instance = NULL;
 
    /**
     * 私有化默認構造方法,保證外界無法直接實例化
     */
    private function __construct() {
    }
 
    /**
     * 靜態工廠方法,返還此類的唯一實例
     */
    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
 
        return self::$_instance;
    }
 
    /**
     * 防止用戶克隆實例
     */
    public function __clone(){
        die('Clone is not allowed.' . E_USER_ERROR);
    }
 
    /**
     * 測試用方法
     */
    public function test() {
        echo 'Singleton Test!';
    }
 
}
 
/**
 * 客戶端
 */
class Client {
 
     /**
     * Main program.
     */
    public static function main() {
        $instance = Singleton::getInstance();
        $instance->test();
    }
}
 
Client::main();
?>

PHP中不支持餓漢式的單例模式
因爲PHP不支持在類定義時給類的成員變量賦予非基本類型的值。如表達式,new操作等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章