大話PHP設計模式之單例模式升級版

接上一篇大話PHP設計模式之單例模式數據庫

這一篇介紹一下升級版的單例模式,廢話不說先上代碼segmentfault

不完美的單例模式

class singleMode {  
  
    //用來指向已建立好的實例  
    public static $instance;  
  
    //判斷是否已經建立過實例  
    public static function getInstance()  
    {  
    //注意!最關鍵的代碼在這
        if (self::$instance === null) {  
            self::$instance = new self();  
        }  
        return self::$instance;  
    }  
}

上面是最典型的單例模式,若是程序徹底是由咱們本身開發,本身使用,這樣作卻是沒有什麼問題了,可是並不完美。若是你的程序是開放的,或者有別人在用你的程序,是能夠繞過這種方式進行重複建立實例的,好比:直接new singleMode()是能夠建立不一樣的實例的。那麼有沒有辦法讓外部不能經過 new singleMode()建立呢,答案是YES,接着看下面的代碼設計模式

禁止外部建立

class singleMode {  
  
    //用來指向已建立好的實例  
    public static $instance;  
  
    //注意!這裏是關鍵  
    private function __construct()  
    {  
  
    }  
  
    //這是咱們須要調用的方法  
    public static function getInstance()  
    {  
        if (self::$instance === null) {  
            self::$instance = new self();  
        }  
        return self::$instance;  
    }  
}

沒錯,使用private function __construct()構造函數的方式就能封死了。這樣是否是就萬事大吉了呢?呃...其實還要封死一個叫clone的方法。函數

禁止外部克隆

$example = singleMode::getInstance();  
$example1 = clone $example;  
$example2 = clone $example;

你不讓我建立,我多複製幾個總行了吧。若是咱們也不容許被複制還要加入下面的代碼。學習

class singleMode {  
  
    //用來指向已建立好的實例  
    public static $instance;  
  
    //構造函數爲空  
    private function __construct()  
    {  
  
    } 
     
    //注意!這裏是關鍵  
    public function __clone()  
    {  
  
    } 
    
    //這是咱們須要調用的方法  
    public static function getInstance()  
    {  
        if (self::$instance === null) {  
            self::$instance = new self();  
        }  
        return self::$instance;  
    }  
}

把clone函數也定義爲空,這樣就大功告成啦。設計

總結

記住!單例模式是爲了防止已經實例化的對象不被再次實例化,因而可知單例模式比較適用於固定且重複的場景,好比要常常訪問數據庫鏈接等,也正是因爲這種固化的模式,單例的限制太多,不夠靈活,因此又引出了別的模式,單例先寫到這吧,有時間再同你們一塊兒學習交流下其餘的設計模式。code

相關文章
相關標籤/搜索