首頁  >  文章  >  後端開發  >  php設計模式中工廠模式和單例模式的區別

php設計模式中工廠模式和單例模式的區別

一个新手
一个新手原創
2017-10-18 09:07:562751瀏覽
//让该类在外界无法造对象
//让外界可以造一个对象,做一个静态方法返回对象
//在类里面通过让静态变量控制返回对象只能是一个。

單例模式的要點有三個:

  1. 一是某個類別只能有一個實例;

  2. #二是它必須自行建立這個實例;

  3. 三是它必須自行提供這個實例給整個系統。

為什麼要使用PHP單例模式

  1. #1. php的應用主要在於資料庫應用, 一個應用程式中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少資料庫連接這樣就不容易出現too many connections情況。

  2. 2. 如果系統中需要有一個類別來全域控制某些設定資訊, 那麼使用單例模式可以很方便的實作. 這個可以參考zend Framework的FrontController部分。

  3. 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn