PHP单例模式Singleton Pattern的原理与实现介绍
作者:php_gl12345678 发布时间:2023-05-26 13:33:28
标签:PHP,Singleton,Pattern,单例模式
单例模式Singleton Pattern是什么
单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个访问它的全局访问点。
单例模式的优点
单例模式可以保证在整个应用程序中,某个实例只有一个存在,节省了系统资源;
单例模式可以提供一个全局访问点,方便客户端代码访问实例;
单例模式可以控制实例的生成,从而保证实例的唯一性。
单例模式的实现
在 PHP 中,我们可以使用以下方式来实现单例模式:
<?php
class Singleton
{
// 私有的静态变量,用于存储唯一实例
private static $instance = null;
// 私有的构造方法,防止外部实例化
private function __construct() {}
// 公有的静态方法,用于获取唯一实例
public static function getInstance()
{
// 如果还没有实例化,则实例化一个新对象
if (self::$instance === null) {
self::$instance = new self();
}
// 返回实例化对象
return self::$instance;
}
// 私有的克隆方法,防止外部克隆对象
private function __clone() {}
// 私有的反序列化方法,防止外部反序列化对象
private function __wakeup() {}
}
在上面的实现中,我们通过私有的静态变量存储唯一实例,通过公有的静态方法获取唯一实例。私有的构造方法、克隆方法、反序列化方法都是为了防止外部实例化、克隆、反序列化对象。这样就可以保证一个类只有一个实例,并提供一个全局访问点。
单例模式的使用
<?php
$single1 = Singleton::getInstance();
$single2 = Singleton::getInstance();
var_dump($single1 === $single2); // output: bool(true)
在上面的使用中,我们通过 Singleton::getInstance() 方法获取唯一实例,然后判断两个实例是否相等,结果为 true,说明只有一个实例存在。
总结
单例模式是一种非常常见的创建型模式,它可以保证一个类只有一个实例,并提供一个全局访问点,从而节省系统资源,方便客户端代码访问实例。在实际开发中,我们可以根据具体的需求,选择不同的单例模式来实现唯一实例的创建。
来源:https://blog.csdn.net/weixin_39934453/article/details/129326216


猜你喜欢
- Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台。连接数据库 注意:假设现有几台在同一局域网内的
- 一.介绍多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表.多表查询有以下分类:交叉连接查询
- 1 random.choicepython random模块的choice方法随机选择某个元素foo = ['a',
- 目录一、生产环境,开发环境切换第一种方法:通过配置.env文件来实现第二种方法二、过滤器三、moment时间库使用一、生产环境,开发环境切换
- 今早打开 腾讯ISD的博客 ,看到一篇新的文章,《迷你屋视觉规范简介》,赶紧看了来学习。不过给我抓到问题咯,臭鱼不介意我在这说下吧:这套规范
- 本文主要介绍了ASP连接11种数据库的常用语法,详细内容请参考下文:1.Access数据库的DSN-less连接方法:set adocon=
- // 1.采用计算属性来获取$store中的值computed: { listenstage() {
- 前言我们在往期对matplotlib.pyplot()方法学习,到现在我们已经会绘制折线图、柱状图、散点等常规的图表啦(往期的内容如下,大家
- 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图可以
- TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术
- 在opencv中,特征检测、描述、匹配都有集成的函数。vector<DMatch> bestMatches;用来存储得到的匹配点
- 看到了很多关于如何读出图片的长度的高度的方法,其实都不实用,大多都是通过图片的大小来判断的,图片的种类众多,通过大小来判断难免要制造很多的代
- 前言注意:网上很多教程说需要在build目录下的dev-server.js文件中配置,但目前最新的vue-cli是没有dev-server.
- 什么是XML?XML 指可扩展标记语言(eXtensibleMarkupLanguage)。 你可以通过本站学习XML教程XML 被设计用来
- 一、调用百度接口进行人脸属性识别安装好baidu-aip模块,获取了百度AI接口密钥后,即可调用百度接口进行人脸属性识别了。首先以杨紫的图片
- 先说下自己之前的环境(都是Linux系统,差别不大):Centos7.6NVIDIA Driver Version 440.33.01(等会
- 最近,某水果手机厂在万众期待中开了一场没有发布万众期待的手机产品的发布会,发布了除手机外的其他一些产品,也包括最新的水果14系统。几天后,更
- spring boot 不连接数据库启动用spring boot 搭建的项目,在配置文件不连接数据库启动项目会报错。原因在于spring b
- 项目地址:https://github.com/GriffinLewis2001/Python_movie_links_scraper运行效
- redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,