單例模式:也叫單態模式(好像各個地方都是叫單例!),是一種常用的軟體設計模式。這個模式規定單例物件的類必須保證這個類只能有一個例項的存在,並提供一個訪問它的全域性訪問點 ( 就算new,也只能讓你new一個物件,畢竟國內是一夫一妻制 ) 。
應用場景:
- 資料庫聯結器
- 日誌程式(一般都是採用單例模式)
- 配置物件
- 多執行緒的執行緒池
- 等等......
由於這個東西不是什麼新奇的玩意,我就結合高手的和我自己的理解例項說明下這個東西怎麼玩:
一切程式碼中解釋
// 私有化
class test
{
// 完全私有化這個建構函式,就不讓你用
private function __construct()
{
//
}
}
// 暴露一個介面給外部訪問
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
//
}
}
// 返還物件
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
return new test(); // 要物件?沒關係國家給發
}
}
// 判斷唯一性
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
$obj = ""
if(empty($obj) // 是不是領過物件了?
{
$obj = new test();
}
return $obj;
}
}
// 設定靜態:雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷
class test
{
private static $obj; // 私密的
private function __construct()
{
//
}
public static function getInstance()
{
if(empty(self::$obj))
{
self::$obj = new test();
}
return self::$obj;
}
}
// 防止克隆
class test
{
private static $obj; // 私密的
private function __construct()
{
//
}
// 暴露給外部, getInstance算是一個小規範
public static function getInstance()
{
/* 用一個靜態變數儲存的例項,
* 只有第一次例項化的時候才賦值,
*/ 以後都直接給出靜態示例
if(empty(self::$obj))
{
self::$obj = new test();
}
return self::$obj; // 返回原配
}
// 根據法律龜腚 禁止克隆物件
private __clone()
{
//
}
}
$t1 = test::getInstance(); // 獲取這個例項化物件
$t2 = test::getInstance();
var_dump($t1===$t2); // true
複製程式碼
有什麼不對的地方還請大神指正,也歡迎提問
寫於:2018年5月20日 參考資料: