目录

  • 前言
  • 定义
  • 特点
  • 适合场景
  • 实现
  • 总结

极客时间《设计模式》(王争)
PHP codes on Gitee
PHP codes on Github

前言

开始补全木桶最短的一片了,跟着王争老师学习设计模式,本人的锤子是PHP,巧了PHP7.0以后是支持继承、接口和抽象类的,应该也算是比较适用来学习设计模式了。在学习过程中,课程中的示例代码都是Java的,虽然可以理解和看懂,但是由于语言特性,Java算是编译型语言,PHP是解释型语言,使用起来还是有一些区别的,本着学习和思考优先的原则,还是尽力把老师讲的代码翻译成PHP吧,相信23个设计模式走过一遭后,会有一个大的飞跃。

定义

单例设计模式(Singleton Design Pattern),一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

特点

存储的数据全局可用且唯一

适合场景

单例模式的用处从业务上来理解,有些数据在系统中只应该保存一份。

  1. 表示全局唯一,某些数据在系统中只能保存一份,比如配置信息类、唯一ID发号器
  2. 处理资源访问冲突、解决资源竞争,例如写日志功能,如果new出多个实例,同时写入一个文件,就可能造成文件中内容的覆盖

实现

概括起来,要实现一个单例,我们需要关注的点无外乎下面几个:

  • 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例
  • 成员变量要静态的(static),保证全局唯一
  • 考虑对象创建时的线程安全问题(PHP暂时不用考虑)
  • 考虑是否支持延迟加载(PHP暂时不用考虑)
  • 考虑 getInstance() 性能是否高(是否加锁)。(PHP暂时不用考虑)

<?php
/*** Created by PhpStorm.* User: 小水* Date: 2021-07-28* Time: 11:50*/namespace App;/*** 懒汉式* Class SingletonLazy* @package App*/
class SingletonLazy
{private static $instance;private $props = [];/*** @return SingletonLazy*/public static function getInstance(){if(!self::$instance){self::$instance = new self();}return self::$instance;}/*** @param $key* @param $value*/public function setProperty($key, $value){$this->props[$key] = $value;}/*** @param $key* @return mixed*/public function getProperty($key){return $this->props[$key];}
}
<?php
/*** Created by PhpStorm.* User: 小水* Date: 2021-07-28* Time: 11:50*/
require __DIR__.'/vendor/autoload.php';$inst1 = \App\SingletonLazy::getInstance();
$inst1->setProperty("hello","world");
echo $inst1->getProperty("hello") .PHP_EOL;
$inst2 = \App\SingletonLazy::getInstance();
echo $inst1->getProperty("hello") .PHP_EOL;

输出结果

$ php client.php
world
world

总结

其中的关键点就三点

  • private static $instance
  • public static function getInstanc()
  • 使用时直接调用静态函数SingletonLazy::getInstance()

参考
[1] 极客时间《设计模式》(王争)链接描述
[2] 《系统架构师教程 第一版》
[3] 从零使用composer初始化PSR-4项目

我和王争学设计模式 |单例模式相关推荐

  1. 我和王争学设计模式|原型模式

    目录 定义 应用场景 示例1 示例2 题目 思路 代码 参考: 极客时间<设计模式>(王争) 定义 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式就是利用内存&qu ...

  2. 我和王争学设计模式|代理模式

    目录 定义 使用场景 需求描述 方法一(接口式) 方法二(继承式) 方法三 (动态代理) 其他参考 极客时间<设计模式>(王争) 定义 为其他对象提供一种代理以控制对这个对象的访问 使用场 ...

  3. 我和王争学设计模式|抽象工厂

    目录 定义 标准框架 产品抽象和实现 工厂抽象和实现 调用工厂制造产品 运行结果 课程中示例改写 参考 极客时间<设计模式>(王争) 定义 提供一个创建一系列相关或相互依赖对象的接口,而无 ...

  4. 我和王争学设计模式|建造者模式

    目录 定义 适用场景 需求描述 代码示例 有趣例子 总结 极客时间<设计模式>(王争) Github Gitee 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...

  5. 我和王争学设计模式|桥接模式

    目录 定义 理解 题目 实现 其他参考 极客时间<设计模式>(王争) 定义 GoF 的<设计模式>一书中 将抽象部分与它的实现相分离,是他们可以独立变化. 其他书中 一个类存在 ...

  6. 我和王争学设计模式|工厂方法

    目录 定义 缺点 代码示例 消除分支语句 极客时间<设计模式>(王争) Github Gitee 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使 ...

  7. 老王讲设计模式(三)——单例模式

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 早晨,老王来到公司,发现小蔡正对着电脑屏幕发呆,于是走到小蔡身后,发现小 ...

  8. 老王讲设计模式(八)——适配器模式

    适配器模式,是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 公司的发展速度很快,一不小心,就收购了一个创业团队去做细分市场.这么一个改变,对于公司来说 ...

  9. 老王讲设计模式(一)——策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 老王最近接到一个工作,上 ...

最新文章

  1. 用Leangoo看板工具做办公室采购流程管理
  2. 基于Spark ALS算法的个性化推荐
  3. (转)搜索Maven仓库 获取 groupid artifactId
  4. 我的征程是未来!带你展望2015年最重要的网页设计趋势
  5. 利用Query判断checkbox是否选中的写法!(
  6. Centos下 自动化配置SSH免密码登陆
  7. 能否直接在Visual Studio Code里查看TypeScript的数据类型定义
  8. python正则表达式判断数字_Python机器学习之手写数字辨识及正则表达式
  9. Installation of Apache HTTPD
  10. java简单运算程序_JAVA实现简单四则混合运算
  11. [LeetCode]Palindrome Number 推断二进制和十进制是否为回文
  12. LeetCode之反转字符串中的单词
  13. WebService之基于REST机制的实现实例(Java版)
  14. 层次分析法模型(数学建模学习)
  15. Retrofit完美封装
  16. HTML5 页面布局【结合案例】
  17. iOS系统快捷指令一键打开北京健康宝个人信息扫码登记界面
  18. 由QQ电脑管家的提示看对新增系统启动项的提示和保护
  19. Git团队协作工作流程
  20. 联想 Thinkpad SL410使用体验

热门文章

  1. Flink学习:Flink常见报错
  2. C语言细节 流程控制
  3. 洛谷p5465 [PKUSC2018]星际穿越
  4. 运算放大器设计及应用参讨(一)
  5. AXI 基础第 2 讲 - 使用 AXI Verification IP (AXI VIP) 对 AXI 接口进行仿真
  6. 第07课:生活中的代理模式——帮我拿一下快递
  7. [架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程
  8. 非主流家族繁体字网名:/╱●銘秂娯樂、
  9. TurtleBot3 循线机器人
  10. 25岁阿里P6有点焦虑,居然想要进体制?