单例模式是软件设计模式中最简单,使用频次最高的设计模式之一。
其目的是:
确保某一个类在系统中只有一个实例(对象)。
应用场景:
- PHP主要的是与数据库进行交互,需要大量的使用数据库操作类,使用单例模式可以避免大量的new 数据库类消耗系统资源。
- 某些应用中需要用一个类来加载配置信息,使用单例模式就会非常方便。
- 在一次页面请求中,便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
代码实现
一般情况下的数据库操作类:
Database.php
<?php
class Database{
//数据库连接操作
}
?>
index.php
<?php
class Index{
$db = new Database(); //new出我们需要的数据库连接实例
}
?>
使用这种方式进行数据库连接,在每一个文件中都需要去new一个数据库实例,而实际中我们只需连接一次就可以了。所以这种方式造成了不必要的资源浪费。
使用单例模式
Database.php
<?php
class Database{
protect $db;
//定义一个私有的构造方法
private __construct(){
}
static public dataCo(){
if(self::$db){
return self::$db;
}
self::$db = new self();
return self::$db
}
}
?>
index.php
<?
php
class Index{
$db = Database::dataCon();
}
?>
使用单例模式创建的数据库连接类,无论你在其他文件中实例多少个数据库连接实例,其实都是一个。
PHP创建工厂模式的步骤:
1.定义一个私有的构造方法。(使类在其他文件中不能通过New来实例化)
private __construct(){ }
2.定义静态方法来实例化本身(在内部进行判断,如实例已经存在直接返 回,如不存在则new出本身并返回)
static public dataCo(){
if(self::$db){
return self::$db;
}
self::$db = new self();
return self::$db
}
3.通过静态方法实例化
$db = Database::dataCon();
其实在一般使用时为了防止对象被克隆还会添加一个__clone
方法。