我和王争学设计模式 |单例模式
目录
- 前言
- 定义
- 特点
- 适合场景
- 实现
- 总结
极客时间《设计模式》(王争)
PHP codes on Gitee
PHP codes on Github
前言
开始补全木桶最短的一片了,跟着王争老师学习设计模式,本人的锤子是PHP
,巧了PHP7.0
以后是支持继承、接口和抽象类的,应该也算是比较适用来学习设计模式了。在学习过程中,课程中的示例代码都是Java
的,虽然可以理解和看懂,但是由于语言特性,Java算是编译型语言,PHP
是解释型语言,使用起来还是有一些区别的,本着学习和思考优先的原则,还是尽力把老师讲的代码翻译成PHP
吧,相信23个设计模式走过一遭后,会有一个大的飞跃。
定义
单例设计模式(Singleton Design Pattern
),一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
特点
存储的数据全局可用且唯一
适合场景
单例模式的用处从业务上来理解,有些数据在系统中只应该保存一份。
- 表示全局唯一,某些数据在系统中只能保存一份,比如配置信息类、唯一
ID
发号器 - 处理资源访问冲突、解决资源竞争,例如写日志功能,如果
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 示例2 题目 思路 代码 参考: 极客时间<设计模式>(王争) 定义 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式就是利用内存&qu ...
- 我和王争学设计模式|代理模式
目录 定义 使用场景 需求描述 方法一(接口式) 方法二(继承式) 方法三 (动态代理) 其他参考 极客时间<设计模式>(王争) 定义 为其他对象提供一种代理以控制对这个对象的访问 使用场 ...
- 我和王争学设计模式|抽象工厂
目录 定义 标准框架 产品抽象和实现 工厂抽象和实现 调用工厂制造产品 运行结果 课程中示例改写 参考 极客时间<设计模式>(王争) 定义 提供一个创建一系列相关或相互依赖对象的接口,而无 ...
- 我和王争学设计模式|建造者模式
目录 定义 适用场景 需求描述 代码示例 有趣例子 总结 极客时间<设计模式>(王争) Github Gitee 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...
- 我和王争学设计模式|桥接模式
目录 定义 理解 题目 实现 其他参考 极客时间<设计模式>(王争) 定义 GoF 的<设计模式>一书中 将抽象部分与它的实现相分离,是他们可以独立变化. 其他书中 一个类存在 ...
- 我和王争学设计模式|工厂方法
目录 定义 缺点 代码示例 消除分支语句 极客时间<设计模式>(王争) Github Gitee 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使 ...
- 老王讲设计模式(三)——单例模式
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 早晨,老王来到公司,发现小蔡正对着电脑屏幕发呆,于是走到小蔡身后,发现小 ...
- 老王讲设计模式(八)——适配器模式
适配器模式,是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 公司的发展速度很快,一不小心,就收购了一个创业团队去做细分市场.这么一个改变,对于公司来说 ...
- 老王讲设计模式(一)——策略模式
策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 老王最近接到一个工作,上 ...
最新文章
- 用Leangoo看板工具做办公室采购流程管理
- 基于Spark ALS算法的个性化推荐
- (转)搜索Maven仓库 获取 groupid artifactId
- 我的征程是未来!带你展望2015年最重要的网页设计趋势
- 利用Query判断checkbox是否选中的写法!(
- Centos下 自动化配置SSH免密码登陆
- 能否直接在Visual Studio Code里查看TypeScript的数据类型定义
- python正则表达式判断数字_Python机器学习之手写数字辨识及正则表达式
- Installation of Apache HTTPD
- java简单运算程序_JAVA实现简单四则混合运算
- [LeetCode]Palindrome Number 推断二进制和十进制是否为回文
- LeetCode之反转字符串中的单词
- WebService之基于REST机制的实现实例(Java版)
- 层次分析法模型(数学建模学习)
- Retrofit完美封装
- HTML5 页面布局【结合案例】
- iOS系统快捷指令一键打开北京健康宝个人信息扫码登记界面
- 由QQ电脑管家的提示看对新增系统启动项的提示和保护
- Git团队协作工作流程
- 联想 Thinkpad SL410使用体验
热门文章
- Flink学习:Flink常见报错
- C语言细节 流程控制
- 洛谷p5465 [PKUSC2018]星际穿越
- 运算放大器设计及应用参讨(一)
- AXI 基础第 2 讲 - 使用 AXI Verification IP (AXI VIP) 对 AXI 接口进行仿真
- 第07课:生活中的代理模式——帮我拿一下快递
- [架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程
- 非主流家族繁体字网名:/╱●銘秂娯樂、
- TurtleBot3 循线机器人
- 25岁阿里P6有点焦虑,居然想要进体制?