单例模式

1. 为什么需要单例模式,解决的问题是什么

众所周知,全局变量捆绑于特定的环境中, 破坏了封装。 一旦你的系统依赖于全局变量, 早晚都会发生冲突。

简单说来,单例模式就相当于一个可控的全局变量。

2. 实现1

class Singleton
{
private static $instance = null;

public static function getInstance()
{
if(self::$instance === null) {
self::$instance = new static();
}
return self::$instance;
}

private function __construct(){}
}

不管调用多少次$single = Singleton::getInstance()都只会生成一个Singleton对象, 一切看起来很完美, 但凡看过射雕英雄传的对 裘千仞 裘千丈 这对双胞胎兄弟应该很有印象, 裘千仞:坐拥铁掌帮,一手铁掌功夫了得, 但是裘千丈凭借着一样的外表, 在很大时候也具有这样的权利, 对code来说这是非常危险的。

当有人对实例化出来的singleton对象进行clone $single的时候, clone的类也具有了singleton类的功能, 不再是全局唯一的了。
对这种情况, 我们只要在上述类中提供一个私有的__clone方法就好了。
private function __clone(){}

OK, 现在$single对象看起来坐拥了Singleton的无限财富, 谁也偷不走。

但是人生也会有很多无奈事, 虽家财万贯,但是出了一个败家子, 奈何呜呼哀哉。

如果有一个类继承了Singleton, 再重写了__construct方法, 把__construct改成了public,  这下又出大事了, 居然再一次可以实例化了

那简单, 直接把类设为final不就行了, 哈哈哈。。。太聪明了, 仔细想想, 感觉哪里不大对, 这是要绝后啊!!!还是只对private方法加上final表示不能重写

最终版本
class Singleton
{
private static $instance = null;

public static function getInstance()
{
if(self::$instance === null) {
self::$instance = new static();
}
return self::$instance;
}

final private function __construct(){}

  final private function __clone(){}

//当然还要注意不被反序列化
final private function __wakeUp(){}
}

使用场景:

1. 当做全局变量使用

2. 只需要实例化一次的类

原文地址:https://www.cnblogs.com/by-pgp/p/6196831.html