單例模式是最常用,也是最簡單的一種設計模式。
什麼是單例模式
他是一個特殊的類,該類在系統執行時只有一個例項。這個類必須提供一個獲取物件例項的方法。
有什麼作用
1.全域性只建立一次例項,提高效能,減少資源損耗
2.自已統一建立例項,具有可控性
等
注意事項
1.需要保證一個執行週期只有一個例項存在,所以任何會創新新例項的方法都要禁用(設為私有)
1) 禁止外部建立例項
2) 禁止例項克隆
2.不要濫用單例模式
程式碼示例
class RedisLogic
{
private static $_instance = null;
static $data = [];
/**
* SingletonClass constructor.
* 禁止外部建立例項
*
*/
private function __construct()
{
}
/**
* 禁止克隆
*
* @throws Exception
*/
private function __clone()
{
throw new Exception(`單例模式,不允許克隆`);
}
/**
* 禁止serialize
*
*/
private function __sleep() {
}
/**
* 禁止unserialize
*
*/
private function __wakeup() {
}
public static function getInstance()
{
if (self::$_instance == null) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* @param string $key
* @param string $extend
* @param int $type
* @param array $options
* @return mixed
*/
public function read($key, $extend = ``, $type = 1, $options = [])
{
global $cur_lang;
$relKey = $this->getKey($key, $extend, $type);
if (isset(static::$data[$relKey])) {
return static::$data[$relKey];
}
// ... 省略業務程式碼
return static::$data[$relKey] = $value;
}
public function write($key, $data, $options = [], $extend = ``, $type = 1)
{
$relKey = $this->getKey($key, $extend, $type);
// ... 省略業務程式碼
}
/**
* @param $key
* @param string $extend
* @param int $type 擴充套件型別,1是擴充套件在後,2在前
* @return int
*/
private function getKey($key, $extend = ``, $type = 1)
{
if (empty($extend)) {
return $key;
}
return $type == 1 ? $key . $extend : $extend . $key;
}
}
demo 禁止系列化,有的情況可能需要這樣。可以參考鳥哥的這遍文章,經測試在php5下是有效的