//让该类在外界无法造对象 //让外界可以造一个对象,做一个静态方法返回对象 //在类里面通过让静态变量控制返回对象只能是一个。
單例模式的要點有三個:
一是某個類別只能有一個實例;
#二是它必須自行建立這個實例;
三是它必須自行提供這個實例給整個系統。
為什麼要使用PHP單例模式
#1. php的應用主要在於資料庫應用, 一個應用程式中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少資料庫連接這樣就不容易出現too many connections情況。
2. 如果系統中需要有一個類別來全域控制某些設定資訊, 那麼使用單例模式可以很方便的實作. 這個可以參考zend Framework的FrontController部分。
3. 在一次頁面請求中, 便於進行調試, 因為所有的程式碼(例如資料庫操作類別db)都集中在一個類別中, 我們可以在類別中設定鉤子,輸出日誌,從而避免到處var_dump, echo。
class cat { public $name; private function __construct() { } static $temp; static function new_ob() { if(empty(self::$temp)){ self::$temp = new cat(); } return self::$temp; } function speak(){ return "喵喵喵"; } } //$mao = new cat(); //如果没有猫就造一个,然后等于新的xxx,如果有,直接等于。达到限制的目的。 //$mao; //if (empty($mao)){ // $mao = new cat(); //} // $xxx = $mao; $mao = cat::new_ob(); $mao2 = cat::new_ob(); //给1猫改名字,2猫的名字输出为1猫改的名字。此为单例。 $mao->name = "py";
2.簡單工廠模式
#①抽象基底類別:類別中定義抽像一些方法,用以在子類別中實作
②繼承自抽象基底類別的子類別:實作基底類別中的抽象方法
③工廠類別:用以實例化所有相對應的子類別
abstract class jsq { public $a; public $b; function yunsuan(){ } } //此为拓展 class jiafa extends jsq { function yunsuan() { //parent::yunsuan(); // TODO: Change the autogenerated stub return $this ->a+$this->b; } } class jianfa extends jsq { function yuansuan(){ return $this->a-$this->b; } } class factory { static function create($x){ switch ($x){ case "+": return new jiafa(); break; case "-": return new jianfa(); break; } } } //$j1 = new jiafa(); //$j1->a = 1; //$j1->b = 2; //$j1->yunsuan(); //尽量避免实例化对象,采用静态方法获取。 $jf = factory::create("+"); $jf->a = 1; $jf->b = 2; echo $jf->yunsuan();
以上是php設計模式中工廠模式和單例模式的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!