2016-01-11 61 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