###單例模式
設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一實例。要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實例化過程。這個方法應該是靜態方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義。
###動機
對于系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或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);
```