单例模式 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 容器
推荐文章: