首页 > 其他分享 >【设计模式】单例模式

【设计模式】单例模式

时间:2024-04-03 10:36:42浏览次数:18  
标签:调用 创建 模式 实例 单例 设计模式

一、介绍

单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。

 

二、单例模式优缺点

优点:

  • 仅在首次请求单例对象时对其进行初始化
  • 你可以保证一个类只有一个实例
  • 获得了一个指向该实例的全局访问节点

缺点

  • 违反了单一职责原则
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象
  • 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。

 

三、实现步骤

  1. 在类中添加一个私有的静态成员变量用于保存单例实例。
  2. 声明一个公有静态构建方法用于获取单例实例。
  3. 在静态方法首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
  4. 将类的构造函数设为私有。

 

四、具体实现

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、调用结果展示

 

标签:调用,创建,模式,实例,单例,设计模式
From: https://www.cnblogs.com/mklblog/p/18112107

相关文章

  • 《解释器模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:对每个data建立一个单点解释器对象X,dataA和dataB之间的关系,建立一个关系解释器对象Y,这里的Y处理的是X1和X2。这样,复用了解释单文本的逻辑,和多文本间关系的逻辑。优点:灵活性:易于改变......
  • 使用c++装饰器模式完成 QQ秀这个游戏,给动画人物搭配不同服饰。
    //比如穿T恤,衬衫,外套,皮鞋,运动鞋,靴子...,根据下面的类图完//被装饰的类classPerson{public:   stringm_name;   Person(){};//子类实例化需要无参构造   Person(stringname):m_name(name){}   virtualvoidshow(){cout<<m_name;};};//......
  • 使用c++观察者模式完成主题订阅 消息通知
    //造主题,主题是默认的新闻主页,主题下面还有具体的频道:经济、体育、娱乐。这样主题也分为两个层,观察者可以订阅新闻主页,也可以订阅具体的频道。//观察者模式//抽象类观察者classAbsObserver{public:   virtualvoidupdate(stringcontent)=0;//更新的接口};......
  • Python的四种单例模式实现方式
    ★单例模式基本介绍单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问......
  • 策略模式详解+代码案例
    首先简单介绍策略模式该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。策略模式的主要角色如......
  • java几种代理模式的实现方式
    1.代理模式代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实......
  • 自动化测试框架的AW模式
       近年自动化测试发展迅猛,几乎每个行业,如GUI、APP、云等都开发出自己的自动化开源框架来满足本行业自动化测试的需求,但这些自动化开源架构大多是偏向自动化实现技术的。从自动化工程角度出发,给出通用的自动化测试框架。 从自动化工程的角度来说,自动化测试框架主要分为4层......
  • KingbaseES V8R6集群运维案例之---single-pro模式备份
    案例说明:KingbaseESV8R6集群物理备份配置参数_target_db_style,可选single或cluster或single-pro。single对应单机模式的目标数据库实例,cluster对应集群模式的目标数据库实例,single-pro对应集群模式的每个DB节点独立备份。本案例详细描述集群架构在singl-pro模式下的备份。适用......
  • 设计模式详解:适配器模式
    什么是适配器模式?在程序设计中,经常会存在一种情况:现有的程序无法直接使用,需要做适当的变换才能使用。而用于填补“现有程序”和“所需程序”之间差异的设计模式就是适配器模式(Adapter)。 不理解?没关系,跟你分享一个生活中的例子!我们在使用笔记本电脑时通常会插上电源,难道......
  • php采用aes算法,字符编码utf8,填充模式ECB,填充:ZeroPadding,编码:base64,实现加密
    原文:https://blog.csdn.net/yinxinyue0621/article/details/129813334一、php:三种填充模式的区别(PKCS7Padding/PKCS5Padding/ZeroPadding)(一)常见的三种填充方式:我们知道某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要......