目录

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

极客时间《设计模式》(王争)
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. 1.3.8 excel for mysql_实时生成并下载大数据量的EXCEL文件,用PHP如何实现
  2. 4个月原生weex混合开发终结()
  3. OSPF的LSA类型 ——连载一路由器LSA
  4. OpenGL pipeline (very important)
  5. C++ STL里的排序去重函数 超级方便
  6. NAS与SAN架构:如何比较这两个存储系统
  7. java word转pdf jacob_java使用jacob.jar将word转pdf
  8. 背景减法——自组织算法
  9. 在win7命令行使用ssh通过秘钥登录linux
  10. Cortex-M0和Cortex-M0+的异常类型
  11. 408复习策略(强化阶段)
  12. cuda 的driver API 和 runtime API
  13. Spring AOP编程官方文档解读之操作Advised对象
  14. 《软技能—代码之外的生存指南》读书笔记之二:自我营销
  15. 传统企业:转型互联网,机遇大,挑战也大
  16. 《AngularJS深度剖析与最佳实践》一2.11 消息
  17. 《费马大定理》个人笔记整理
  18. 初学Python之华氏摄氏温度转换
  19. Java常见的线程安全工具容器类(待完善)
  20. 苹果iphone 6s手机测评

热门文章

  1. 社区教育计算机培训材料,远程教育在社区教育培训中的实效性
  2. 华为带火落后的增程式技术,吓得传统汽车企业瑟瑟发抖
  3. 加来道雄 基因编辑 纳米机器人_纳米机器人
  4. 计算机视觉(本科课程) 北京邮电大学 鲁鹏
  5. webrtc流媒体转发服务器
  6. jaxb xsd java_jaxb 这个资料,可以吧后缀为.xsd的文件,转化成java类使用, 方法在 里面有详细的说 Develop 238万源代码下载- www.pudn.com...
  7. 李国杰院士:AI创业公司如何摆脱被收购的命运「附雷克世界专访」
  8. 中国苏打石灰玻璃行业市场供需与战略研究报告
  9. R语言导入数据文件(数据导入、加载、读取)、导入csv、excel、sav、por、dat、sas7bdat格式文件
  10. oracle导出导入工具expdp/impdp