PHP设计模式笔记:单例模式(singleton)

单例模式:

保证一个类仅有一个实例,并且提供一个访问它的全局访问点

要点:

结构图:

Alt text

角色:

应用场景:

优点:

跟全局变量比较:

全局变量就是对一个对象的静态引用,全局变量确实可以提供单例模式实现的全局访问这个功能, 但是,它并不能保证应用程序中只有一个实例,同时,在编码规范中,也明确指出,
应该要少用全局变量,因为过多的使用全局变量,会造成代码难读,
还有就是全局变量并不能实现继承(虽然单例模式在继承上也不能很好的处理,但是还是可以实现继承的)
而单例模式的话,其在类中保存了它的唯一实例,这个类,它可以保证只能创建一个实例,
同时,它还提供了一个访问该唯一实例的全局访问点。

<?php
/**
 * 单例模式
 * @author phppan
 * @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();
?>