【php實現設計模式】之單例模式

烏啦啦發表於2019-02-16

單例模式是最常用,也是最簡單的一種設計模式。

什麼是單例模式
他是一個特殊的類,該類在系統執行時只有一個例項。這個類必須提供一個獲取物件例項的方法。

有什麼作用
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下是有效的

Serialize/Unserialize破壞單例

相關文章