单例模式 Singleton Pattern

未匹配的标注

定义

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

设计的原则和思想

1. 解耦了对象的创建和使用。
2. 不变部分是使用,变化部分是创建。
3. 核心思想是控制对象创建的数量。

一句话概括设计模式

一个类只实例化一次。

结构中包含的角色

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 容器

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~