## 定义
	一个类只拥有一个实例，且能提供全局访问的方法。

## 设计的原则和思想
	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 容器