简介
单例模式是指整个应用中类只有一个对象实例的设计模式。它通常被用来创建对象,确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
它是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。
特点
一个类在整个应用中有且只有一个实例
类必须自行创建这个实例
必须自行向整个系统提供这个实例
作用
使用单例模式最大的作用就是能减少系统开销,节约资源。比如我们在使用php进行日常开发中,经常需要多次连接MySQL或redis等各种关系型、非关系型数据库,如果不使用单例模式,则需多次进行new创建新的实例,都会消耗大量的内存资源和系统资源。
要点
1、需要一个保存类的唯一实例的静态成员变量
private static $_instance;
登录后复制
2、构造函数和克隆函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
// 私有化构造方法,防止new实例 private function __construct() { $this->_db = pg_connect('demo'); } // 覆盖__clone()方法,禁止克隆 private function __clone() { }
登录后复制
3、必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
// 用于返回对象实例的公共静态方法 public static function getInstance() { // 判断当前实例是否已经创建 if (!(self::$_instance instanceof self) ) { // 如果没有,则创建 self::$_instance = new self(); } // 最终返回实例 return self::$_instance; }
登录后复制
讲解
下面我就以一个MySQL操作类为例给大家演示下它的写法。
代码:
<?php /** * Class DB 数据库操作类 */ class Db { private $_db; private static $_instance; // 私有化构造方法,防止外部new实例 private function __construct(...) { // 这里主要用于连接数据库,细节此处省略 $this->_db = pg_connect(...); } // 覆盖__clone()方法,禁止克隆 private function __clone() { } // 返回对象实例 public static function getInstance() { // 判断是否存在对象实例 if(! (self::$_instance instanceof self) ) { // 不存在则创建保存 self::$_instance = new self(); } // 返回对象实例 return self::$_instance; } // 其他方法 public function addUserInfo(...) { } // 其他方法 public function getUserInfo(...) { } } // 演示 $db = Db::getInstance(); $db->addUserInfo(...); $db->getUserInfo(...);
登录后复制
总结
讲了这么多单例模式的内容,可不是说它没有缺点哦,下面我列出了使用单例模式的优缺点,大家看下,可以根据实际需求选择使用。
单例模式的优缺点:
优点:
改进系统的设计
是对全局变量的一种改进
节省系统资源开销
缺点:
难于调试
隐藏的依赖关系
无法用错误类型的数据覆写一个单例