PHP之单例模式

图片来自:http://www.ngchina.com.cn/

单例模式:也叫单态模式(好像各个地方都是叫单例!),是一种常用的软件设计模式。这个模式规定单例对象的类必须保证这个类只能有一个实例的存在,并提供一个访问它的全局访问点 ( 就算new,也只能让你new一个对象,毕竟国内是一夫一妻制 )


应用场景:

  • 数据库连接器
  • 日志程序(一般都是采用单例模式)
  • 配置对象
  • 多线程的线程池
  • 等等......

由于这个东西不是什么新奇的玩意,我就结合高手的和我自己的理解实例说明下这个东西怎么玩:

一切代码中解释

// 私有化
class test
{
    // 完全私有化这个构造函数,就不让你用
    private function __construct()
    {
        // 
    }
}

// 暴露一个接口给外部访问
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        //
    }
}
// 返还对象
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        return new test(); // 要对象?没关系国家给发
    }
}
// 判断唯一性
class test
{
    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        $obj = ""
        if(empty($obj) // 是不是领过对象了?
        {
            $obj = new test(); 
        }
        return $obj;
    }
}
// 设置静态:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销
class test
{
    private static $obj; // 私密的

    private function __construct()
    {
        // 
    }
    public static function getInstance()
    {
        if(empty(self::$obj))
        {
            self::$obj = new test(); 
        }
        return self::$obj;
    }
}
// 防止克隆

class test
{
    private static $obj; // 私密的
    
    private function __construct()
    {
        // 
    }
    // 暴露给外部, getInstance算是一个小规范
    public static function getInstance()
    {
       /* 用一个静态变量存储的实例,
        * 只有第一次实例化的时候才赋值,
        */ 以后都直接给出静态示例
        if(empty(self::$obj))
        {
            self::$obj = new test(); 
        }
        return self::$obj; // 返回原配
    }
    // 根据法律龟腚 禁止克隆对象
    private __clone()
    {
        // 
    }
}
$t1 = test::getInstance(); // 获取这个实例化对象
$t2 = test::getInstance();
var_dump($t1===$t2);  // true

参考资料:

百度百科

维基百科

网友博客

你可能感兴趣的:(PHP之单例模式)