2016-01-11 95 views
1

我正在閱讀關於PHP中的設計模式,我對我爲實現工廠設計模式而編寫的代碼持懷疑態度。PHP中的工廠設計模式,這是正確的嗎?

此代碼是否實施REAL工廠設計?

而且,我需要在這裏使用任何接口嗎?

的代碼是:

class DBFactory 
{ 
    const MYSQL  = 1; 
    const ORACLE  = 2; 
    const SQLITE  = 3; 

    private $objectTxt = null; 

    function __construct($type) 
    { 
     if ($type == self::MYSQL) { 
      $this->objectTxt = 'MySQL Object'; 
      return ; //MySQL Object 
     } 

     else if ($type == self::ORACLE) 
     { 
      $this->objectTxt = 'Oracle Object'; 
      return ; //Oracle Object 
     } 

     else if ($type == self::SQLITE) 
     { 
      $this->objectTxt = 'SQlite Object'; 
      return 'SQLite Object'; //SQLite Object   
     } 
    } 

    function __toString() { 
     return $this->objectTxt; 
    } 
} 
+0

看起來像一個對象,它實現了它自己的f實例時間的工廠。通常我會希望看到靜態方法或完全獨立的類。查找Doctrine DBAL,這就是工廠模式。 – Flosculus

+0

@Flosculus **通常**表示理想? – Ahmad

+0

**通常**意味着**常規** – Flosculus

回答

1

是的,這是實現Factory Design Pattern,但是,它的更好使用一個靜態方法,如下所示:

public static function getInstance($type) { ... } 

爲了得到一個實例:

$db = DBFactory::getInstance(DBFactory::MYSQL); 
+5

+1將構造函數的代碼推送到它自己的方法。但是「使用靜態方法要好得多」 - 並非如此。如果你堅持這個觀點,請告訴你爲什麼。 – DanFromGermany

+0

謝謝,@DanFromGermany,由於更快的實例化,使用靜態方法的**更好**。 您只需要獲取對象的實例,那麼,爲什麼要編寫更多代碼來獲取實例呢?它在其他類中也更具可讀性和可訪問性。 想象一下,我們有另一個訪問Factory類的類,在這種情況下,我們需要首先實例化Factory,但是,使用靜態方法,我們根本不需要這樣做。 – Ahmad

+3

:-)有幾件事情是針對靜態的:初始化依賴關係。你不能用靜態調用來完成它,而且在大型項目中,你經常會有很多依賴項。而且你經常需要一個好的堆棧跟蹤,這對於靜態而言並不總是可能的。順便說一句,對靜態函數的調用不需要實例。它可以有一個,如果它是一個單身人士。 – DanFromGermany