极简设计模式-单例模式

PHP技术
346
0
0
2022-07-22

单例模式 - Singleton Pattern

定义

一个类只拥有一个实例,且能提供全局访问的方法。

一句话概括设计模式

一个类只实例化一次。

结构中包含的角色

Singleton 单例对象

最小可表达代码

// final 不能继承
final class Singleton
{
    private static $instance;

    // 不能创建实例 
    private function __construct(){}

    // 不能克隆 
    private function __clone(){}

    // 不能序列化 
    private function __wakeup(){}

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

        return static::$instance;
    }
}

设计的原则和思想

控制对象创建的数量。

优点

  1. 内存中只存在一个对象,可以节约系统资源。
  2. 基于单例模式,我们可以通过控制指定数量的对象实现多例或者对象池模式。
  3. 全局只有唯一获取实例的地方,严格控制用户怎样访问它。(因为自身有充当工厂的角色)

缺点

  1. 隐藏类之间的依赖关系
  2. 对代码的可测试性不友好
  3. 不支持有参数的构造函数
  4. 没有抽象层,对代码的扩展性不友好。
  5. 职责过重,充当了工厂和产品角色,违反了单一职责原则。
  6. OOP的四大特性是封装、抽象、继承、多态。单例这种设计模式对于其中的抽象、继承、多态都支持得不好。

何时使用

  1. 当您想控制实例数目,节省系统资源时。
  2. 系统只需要一个实例对象时。
  3. 控制用户怎样获取实例,因为全局只有一处生成实例的地方。

实际应用场景

  1. Laravel的DB类。
  2. 用户浏览企业的浏览次数。

单例的替代方案

  1. 工厂模式
  2. IOC 容器