单例模式 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 网站上。

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~