###单例模式
设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
###动机
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
[PHP设计模式-单例模式](http://www.cnblogs.com/yangjinjin/archive/2013/01/31/2887492.html)
###单例模式三大原则
1. 构造函数需要标记为非 public(防止外部使用 new 操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2. 拥有一个保存类的实例的静态成员变量 $_instance;
3. 拥有一个访问这个实例的公共的静态方法
###实例代码
```php
class Db {
static private $_instance; // 保存类的实例
static private $_connectSource; // 连接的资源
private $_dbConfig = array(
'host' => '192.168.2.110',
'user' => 'root',
'password' => 'root',
'database' => 'muke',
);
// 构造函数需要设置成私有,防止被其他类实例化
private function __construct() {
}
// 访问实例的公共方法
static public function getInstance() {
// 是否实例,如果没有则实例化类
if (!self::$_instance instanceof self) {
self::$_instance = new self();
}
return self::$_instance;
}
public function connect() {
if(!self::$_connectSource) {
self::$_connectSource = mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);
if(!self::$_connectSource) {
die('mysql connect error'. mysql_error());
}
mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
mysql_query("set names UTF8", self::$_connectSource);
return self::$_connectSource;
}
}
}
$connect = Db::getInstance()->connect();
$sql = "select * from mk_user";
$result = mysql_query($sql, $connect);
echo mysql_fetch_row($result);
var_dump($result);
```