您的位置:首页 > 编程语言 > PHP开发

PHP设计模式之单例模式

2016-02-26 14:21 579 查看
PHP设计模式之单例模式

单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

1. 实现单例模式所要考虑的问题:

问题1:只能有一个实例,new是罪恶的根源,想办法让外部不能new如何解决?

解决方法:通过将构造方法,保护或私有化,外部即不能生成实例了。

问题2:不能new了,那不成0例模式了吗?那总得想办法生成一个实例吧?

解决方法:既然在外部不能new了,内部可以new啊,所以决定在内部通过静态方法new一个实例。

问题3:现在有实例了,但外部每次调用静态方法生成实例,都不是一个对象。 如何防止呢?

解决方法:在内部将这个实例保存下来,并做判断。

问题4:在外部通过clone函数克隆一个对象,此对象又发生了变化,如何解决?

解决方法:利用__clone魔术方法 解决此问题。

2. 单例模式应用场景

2.1. 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现 too many connections情况。

2.2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。

2.3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

3. 例子

/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
*/
class man
{
//保存例实例在此属性中
private static $_instance;

//构造函数声明为private,防止直接创建对象
private function __construct()
{
echo '我被实例化了!';
}

//单例方法
public static function get_instance()
{
var_dump(isset(self::$_instance));

if(!isset(self::$_instance))
{
self::$_instance=new self();
}
return self::$_instance;
}

//阻止用户复制对象实例
private function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
}

function test()
{
echo("test");

}
}

// 这个写法会出错,因为构造方法被声明为private
//$test = new man;

// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: