接上一篇大話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