目的

      使应用中只存在一个对象的实例,并且使这个单实例负责所有对该对象的调用。


单例模式 vs 工厂模式

      单例模式解决如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。


单例模式

单例模式 UML图

$_instance必须声明为静态的私有变量

构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义

getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用

::操作符只能访问静态变量和静态函数

new对象都会消耗内存

使用场景:最常用的地方是数据库连接。

使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。

私有的__clone()方法防止克隆对象


举例

       单例模式,使某个类的对象仅允许创建一个。构造函数private修饰, 申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。如下代码对数据库操作进行单例模式代码设计
<?php 
namespace Common;

final class Db{
    private static $db = null;
	
	//唯一可以创建/获取 Db类实例的方法
    public static function getInstance(){
		if (static::$db === null) {
			//条件判断Db类是否已经new过
			//构造方法被设置为了私有的,外部不能直接new,但自己内部可以new
            static::$db = new static();
        }

        return static::$db;
    }
	
	//禁止使用 new 创建Db类
    private function __construct(){

    }
	
	//禁止使用 clone 创建Db类
	private function __clone()
    {
	
    }
	
	//禁止使用 反序列化 创建Db类
	private function __wakeup()
    {
    }
	
    //下面省略一系列操作数据库的方法
}

单例模式的应用场景很多,比如:线程池、缓存、日志对象、数据库操作、显卡的驱动程序等


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部

忘忧竹林

竹林仙境,岁月无痕;

乐而忘忧,心底无尘。