单例模式 - Singleton Pattern
定义
一个类只拥有一个实例,且能提供全局访问的方法。
一句话概括设计模式
一个类只实例化一次。
结构中包含的角色
Singleton 单例对象
最小可表达代码
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;
}
}
设计的原则和思想
控制对象创建的数量。
优点
- 内存中只存在一个对象,可以节约系统资源。
- 基于单例模式,我们可以通过控制指定数量的对象实现多例或者对象池模式。
- 全局只有唯一获取实例的地方,严格控制用户怎样访问它。(因为自身有充当工厂的角色)
缺点
- 隐藏类之间的依赖关系
- 对代码的可测试性不友好
- 不支持有参数的构造函数
- 没有抽象层,对代码的扩展性不友好。
- 职责过重,充当了工厂和产品角色,违反了单一职责原则。
- OOP的四大特性是封装、抽象、继承、多态。单例这种设计模式对于其中的抽象、继承、多态都支持得不好。
何时使用
- 当您想控制实例数目,节省系统资源时。
- 系统只需要一个实例对象时。
- 控制用户怎样获取实例,因为全局只有一处生成实例的地方。
实际应用场景
- Laravel的DB类。
- 用户浏览企业的浏览次数。
单例的替代方案
- 工厂模式
- IOC 容器