只生成一个对象实例的特殊类
特点:
- 无法从外部实例化
使用场景:
- 任务管理器,因为不能同时打开两个任务管理器
- 回收站,在使用windows过程中,回收站一直运行维护一个唯一的实例
- 网站计数器,一般也是采用单例模式实现,否则难以同步
- 应用程序的日志应用
- Web应用的配置对象的读取,
Laravel读取.env文件也是使用的单例 - 数据库连接池
- ……

class Preferences{private array $props = [];private static $instance;private function __construct(){}private function __clone(){}public static function getInstance(): self{if (empty(self::$instace)) {self::$instance = new self();}return self::$instance;}public function setProperty(string $key,string $val){$this->props[$key] = $val;}public function getProperty(string $key){return $this->props[$key];}}
$instance = Preferences::getInstance();$instance->setProperty('name','jack');// 销毁实例unset($instance);// 创建新实例$prefre = Preferences::getInstance();$prefre->getProperty('name'); // jack
总结:
单例和全局变量都容易被误用。因为在使用单例时,依赖关系隐藏于方法后。没有体现在方法签名中。这使得我们在开发时难以跟踪系统中的依赖关系。因此,应当小心谨慎地使用单例类。
