【设计模式】单例模式
设计模式
一、介绍
单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。
二、单例模式优缺点
优点:
- 仅在首次请求单例对象时对其进行初始化
- 你可以保证一个类只有一个实例
- 获得了一个指向该实例的全局访问节点
缺点
- 违反了单一职责原则
- 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象
- 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。
三、实现步骤
- 在类中添加一个私有的静态成员变量用于保存单例实例。
- 声明一个公有静态构建方法用于获取单例实例。
- 在静态方法首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
- 将类的构造函数设为私有。
四、具体实现
1、单例类
<?php /** * Created by PhpStorm * Author: fengzi * Date: 2024/4/3 * Time: 10:05 */ namespace app\admin\service\singleton; /** * 单例模式 */ class SingletonService { /** * 私有的静态变量保存类的唯一实例 */ private static ?SingletonService $instance = null; /** * 私有构造函数,防止外部实例化 */ private function __construct(){ } /** * 获取类的唯一实例 * @return SingletonService|null * @Author: fengzi * @Date: 2024/4/3 10:10 */ public static function getInstance() :SingletonService { if(self::$instance === null){ self::$instance = new self(); } return self::$instance; } /** * 防止对象被克隆 * @return void * @Author: fengzi * @Date: 2024/4/3 10:10 */ private function __clone(){ } /** * 防止反序列化导致实例化 * @return void * @throws \Exception * @Author: fengzi * @Date: 2024/4/3 10:10 */ public function __wakeup(){ throw new \Exception("Cannot unserialize singleton"); } }
2、客户端调用
<?php /** * Created by PhpStorm * Author: fengzi * Date: 2024/4/3 * Time: 10:02 */ namespace app\admin\controller\singleton; use app\admin\service\singleton\SingletonService; class SingletonController { public function index() { $s1 = SingletonService::getInstance(); $s2 = SingletonService::getInstance(); if ( $s1 === $s2 ) { echo '是同一个实例'; } else { echo '不是同一个实例'; } } }
3、调用结果展示
本文来自博客园,作者:疯子丶pony,转载请注明原文链接:https://www.cnblogs.com/mklblog/p/18112107