极简设计模式-单例模式

定义

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

一句话概括设计模式

一个类只实例化一次。

结构中包含的角色

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 容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值