设计模式?听起来很高大上?的确是这样的。设计模式就是组织代码的方式,也就是说代码不再是一条条的往下执行,按照前人总结的行之有效的方法,更有效的来组织代码,这样效率更高,而且看起来也清晰有序。

php单例模式,起初不是很熟悉,是在看MVC框架源代码的时候才注意到的,设计模式在框架的设计应用中很广泛,因此框架的代码更有序高效。

单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称为单例类。

单例模式有三个特点:

1.某个类只能有一个实例。

2.这个类必须自己创建这个实例。

3.这个类必须自行向系统提供这个实例。

为什幺使用"单例模式"?

先看一段代码:(这是一个数据库连接类)

<?php
class Mysql
{
// MYSQL数据库连接信息
const HOSTNAME = "127.0.0.1";
const USERNAME = "root";
const PASSWORD = "***";
const DBNAME = "test";
const CHARSET = "utf8"; public function MysqlConnect()
{
$db = new mysqli(self::HOSTNAME, self::USERNAEM, self::PASSWORD, self::DBNAME); // 连接数据库
$db->query("set names ".self::CHARSET);
if (mysqli_connect_errno())
{
throw new MysqlException("服务器系统故障", 1001);
}
else
{
return $db;
}
}
}
?>

每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回连接,然后close掉连接,频繁的new和数据库连接关闭操作非常的消耗资源!数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

因此,为了避免资源消耗,我们有了下面的改进:

<?php
class Mysql{
//该属性用来保存实例
private static $conn;
//构造函数为private,防止创建对象
private function __construct(){
$this->conn = mysql_connect('localhost','root','');
}
//创建一个用来实例化对象的方法
public static function getInstance(){
if(!(self::$conn instanceof self)){
self::$conn = new self;
}
return self::$conn;
}
//防止对象被复制
public function __clone(){
trigger_error('Clone is not allowed !');
} }
//只能这样取得实例,不能new 和 clone
$mysql = Mysql::getInstance();
?>

这样就不用每次都来new这个类了,方便了很多。下面给一个详细的:

<?php
class Mysql
{
private $DB;
static private $_instance;
// 连接数据库
private function __construct($host, $username, $password)
{
$this->DB = mysql_connect($host, $username, $password);
$this->query("SET NAMES 'utf8'", $this->link);
return $this->DB;
} private function __clone(){} public static function getInstance($host, $username, $password)
{
if( !(self::$_instance instanceof self) )
{
self::$_instance = new self($host, $username, $password);
}
return self::$_instance;
} // 连接数据表
public function select_db($database)
{
$this->result = mysql_select_db($database);
return $this->result;
} // 执行SQL语句
public function query($query)
{
return $this->result = mysql_query($query, $this->link);
} // 将结果集保存为数组
public function fetch_array($fetch_array)
{
return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
} // 获得记录数目
public function num_rows($query)
{
return $this->result = mysql_num_rows($query);
} // 关闭数据库连接
public function close()
{
return $this->result = mysql_close($this->link);
} }
?>

使用的时候:

$con = Mysql::getInstance($host, $username, $password);
$con -> select_db($database);

当然,单例模式不仅仅只是应用在数据库的操作类上面。还可以应用在这些方面:

1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

2. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

3. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

原出处https://www.cnblogs.com/miketwais/articles/Singleton_pattern.html

最新文章

  1. Slave I/O: Got fatal error 1236
  2. 安装MySQL5.7
  3. web.xml文件报错:The processing instruction target matching &quot;[xX][mM][lL]&quot; is not allowed.
  4. poj 2245 Lotto
  5. HDU 4706:Children&#39;s Day
  6. 4月13日学习笔记——jQuery工具函数
  7. 黑盒测试用例设计方法&amp;理论结合实际 -&gt; 错误推断法
  8. HDU 1074 Doing Homework (dp+状态压缩)
  9. bug记录_document.defaultview.getcomputedstyle()
  10. SG 函数 S-Nim
  11. 前端 $.parseJson()
  12. [LeetCode&amp;Python] Problem 101. Symmetric Tree
  13. Pycharm的激活码,亲测可用(20181223)
  14. 在 Azure Resource Manager 模板中使用托管磁盘
  15. Linux内存管理2---段机制
  16. 用eclipse调试scala工程代码
  17. License 校验
  18. Python学习-33.Python中glob模块的一些参数
  19. 了解 Azure VM 的系统重启
  20. C++(三十三) — 全局函数、成员函数的区别

热门文章

  1. 性能测试工具LoadRuner你所不知道的内幕
  2. Spring框架——基于XML/注解开发
  3. 【转】Typora极简教程
  4. 解决2020-3-27 github无法访问
  5. Ansible Playbook 初识
  6. effective-java学习笔记---注解优于命名模式39
  7. Java并发编程锁之独占公平锁与非公平锁比较
  8. ASP.NET Core技术研究-探秘Host主机启动过程
  9. docker-compose搭建redis哨兵集群
  10. 封装属于自己的Python包