正文

在OOP中,一个对象只负责一个特定的任务通常是一种很好的做法。例如,你也许希望只让一个对象去访问数据库。单例模式被认为是职责模式,这是因为它将创建对象的控制权委托到一个单一的访问点上。

在任何时候,应用程序中都会只有这个类仅有的一个实例存在。

这可以防止我们去打开数据库的多个连接,或者不必要得使用多余的系统资源。

在更加复杂的系统中,使用单例模式在维持系统程序状态的同步方面也尤其有用。

所有的单例模式至少拥有以下三个公共元素:

  • 它们必须拥有一个构造函数,并且被标记为private。
  • 它们拥有一个保存类的实例的静态成员变量。
  • 它们拥有一个访问这个实例的公共的静态方法。

和普通类不同的是,单例模式不能在其它类中直接实例化。单例模式只能被其自身实例化。要获得这种限制效果,__construct()方法必须被标记为private。如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误。

要让单例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法。单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。结果是单例类不会重复占用内存和系统资源,从而让应用程序的其他部分更好的使用这些资源。作为这一模式的一部分,必须创建一个空的私有的__clone()方法,以防止对象呗复制或者克隆。

返回实例引用的这个方法通常被命名为getInstance()。这个方法必须是静态的,而且如果它还没有实例化,就必须实例化。getInstance()方法通过使用instanceof操作符和self关键字,可以检测到类是否已经被初始化。如果保存实例的静态成员为空或者还不是类自身的一个实例,那么这个实例将会被创建并保存到存放实例的变量中。

示例

<?phpclass UniqueRandNumber
{private $_num;static $_instance;$urn = new UniqueRandNumber();非法,因为构造函数是私有的private function __construct(){echo "construct\n";$this->_num = rand(1, 100); //生成[1,100]之间的一个随机整数}//将__clone()设置为私有,则$urn2 = clone $urn1;这句话不合法private function __clone(){}public static function getInstance(){if(!(self::$_instance instanceof self)){self::$_instance = new self();}return self::$_instance;}public function fetch(){return $this->_num;}
}echo "getInstance1: \n";
$urn1 = UniqueRandNumber::getInstance();
echo "getInstance1: \n";
$urn2 = UniqueRandNumber::getInstance();echo "\n";
echo $urn1->fetch()."\n";
echo $urn2->fetch()."\n";输出
getInstance1:
construct
getInstance1: 73
73

可以看出,两次getInstance()只调用了一次构造函数。

数据库连接单例模式

对于数据库连接,一个例子是

<?phpclass Database
{private $_db;static $_instance;private function __construct(){$dsn = '';$this->_db = new PDO($dsn);}private function __clone(){}public static function getInstance(){if(!(self::$_instance instanceof self)){self::$_instance = new self();}return self::$_instance;}public function getPDO(){return $this->_db;}
}$database = Database::getInstance();
$pdo = $database->getPDO();

参考

  • PHP高级程序设计-模式、框架和测试,Kevin,P17
  • clone介绍(php5对象复制、clone、浅复制与深复制)

PHP中的单例模式(可用于数据库连接维护)相关推荐

  1. php应用数据库连接中的单例模式

    所谓的单例模式简而言之就是某个类在运行过程中只有一个实例,并且能够自行实例化并为整个系统的运行提供这个实例.在数据库连接中使用单例模式实例化数据库连接对象主要是可以避免重复的实例化对象而造成资源的浪费 ...

  2. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

  3. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  4. rto初始化和计算_TCP系列13—重传—3、协议中RTO计算和RTO定时器维护

    从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...

  5. 机器学习中,什么是预测性维护,常见技术有哪些

    本文要点: 学习预测性维护系统(PMS),监控未来的系统故障并提前安排维护时间表 探讨如何构建机器学习模型进行系统的预测性维护 了解机器学习的处理步骤,如选择模型以及用Auto-Encoder技术去除 ...

  6. C# 中实现单例模式

    文章目录 简介 不安全线程的单例模式 简单安全线程带锁 双重检查 - 带锁 安全初始化 安全并且懒汉式静态初始化 带泛型的懒汉式单例 异常 提高效率 总结 简介 单例模式是软件工程中广为人知的设计模式 ...

  7. python编程入门单例_常见的在Python中实现单例模式的三种方法

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  8. Java中的单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 最近网上查找资料做了一下总结,Java中的单例模式主要是有以下两种实现方式: 1.public class Singleton ...

  9. 是否可以在Gradle中声明一个可用于Java的变量?

    本文翻译自:Is it possible to declare a variable in Gradle usable in Java? Is it possible to declare a var ...

  10. eclipse mysql Xml配置_mysql8.0在eclipse中通过xml文件配置数据库连接池

    mysql8.0在eclipse中通过xml文件配置数据库连接池 1.关于Mysql8.0 2.数据库连接池(DBCP) 3.准备工作 4.配置context.xml 5.配置web.xml 6.调用 ...

最新文章

  1. C# 篇基础知识3——面向对象编程
  2. 想学python有什么用-学python日常工作有什么用?
  3. 【GDKOI2003】分球
  4. 【未完待续】Git个人solo实际常用命令
  5. CF 67A - Partial Teacher
  6. 一阶电路误差分析_读图学电路原理为什么交流调理电路会产生滞后,直流偏置又是什么...
  7. JDBC 出现references non-existing project XXX, launch configuration问题的解决办法
  8. python 1秒启动一个下载服务器
  9. 【HDOJ6986】Kanade Loves Maze Designing(暴力,dfs树)
  10. Python遗传算法部分匹配交叉(PMX)
  11. u盘文件夹被隐藏怎么恢复正常?
  12. 02-iOS蓝牙连接流程介绍
  13. 京东咚咚架构演进(IM通讯)
  14. 联想Y450 GT130M显卡 使用NVIDIA公版驱动(安装成功)
  15. 卸载CDH5.14.2
  16. Marvell推出Andromeda Box IoT平台,加速物联网装置开发
  17. linux进程等待wait()实例
  18. C4996 scanf:This function or variable may be unsafe. / C6031 返回值被忽略.
  19. 远程IO模块16DO开关量输出采集远程模块
  20. Matlab标题加变量

热门文章

  1. 二维数组 详解(C++)
  2. python-视频抽帧、数据集命名
  3. 牛客寒假算法集训营(4)
  4. 男生是学计算机网络还是应用,男生适合读计算机网络技术专业吗
  5. linux定时器王贤才,《linux内核设计与实现》 学习笔记(十七)---设备和模块
  6. linux修改数据库密码出现的问题吗,关于linux下mysql修改root密码时遇到的问题
  7. java fx combox,combobox – 带有FXML的组合框JavaFx
  8. java类分析_java常用类系列之System
  9. 如何获得base64图片的高度_如何使坡口机工作的高度获得提升
  10. php 接口并发测试的方法