php單例模式
單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。
要點主要有三個:
1.一個類只能有一個對象;
2.必須是自行創建這個類的對象;
3,要想整個系統提供這一個對象;
從具體實現角度來說,就是以下三點:
一是單例模式的類只提供私有的構造函數,
二是類定義中含有一個該類的靜態私有對象,
三是該類提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象。
當然還要有一個private的clone方法,防止克隆;
優點
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用。。(此處不是很懂,求解)
php單例代碼演示:
1 <?php 2 //單例 3 class Uni{ 4 //創建靜態私有的變量保存該類對象 5 static private $instance; 6 //參數 7 private $config; 8 //防止直接創建對象 9 private function __construct($config){ 10 $this -> config = $config; 11 echo "我被實例化了"; 12 } 13 //防止克隆對象 14 private function __clone(){ 15 16 } 17 static public function getInstance($config){ 18 //判斷$instance是否是Uni的對象 19 //沒有則創建 20 if (!self::$instance instanceof self) { 21 self::$instance = new self($config); 22 } 23 return self::$instance; 24 25 } 26 public function getName(){ 27 echo $this -> config; 28 } 29 } 30 $db1 = Uni::getInstance(1); 31 $db1 -> getName(); 32 echo "<br>"; 33 $db2 = Uni::getInstance(4); 34 $db2 -> getName(); 35 ?>
運行結果:
我被實例化了1
1
$db1創建對象后,參數是1
$db2沒有創建對象,而是直接使用$instance保存的唯一對象,所以輸出的參數並沒有變為4;