具有非抽象产品的方法工厂

Method Factory with Non Abstract Product

我正在实施工厂方法模式,但检查了几个示例后我无法确定为产品扩展具体 class 而不是创建抽象 class 或接口是否正确...这只是一个例子(PHP)。

所以,我有我的抽象工厂和它们的具体工厂:

interface BookFactoryInterface
{
    public function createBook();
}

class ElectronicBookFactory implements BookFactoryInterface
{
    public function createBook()
    {
        return new ElectronicBook();
    }
}

class PaperBookFactory implements BookFactoryInterface
{
    public function createBook()
    {
        return new PaperBook();
    }
}

现在我在所有示例中看到的是,产品通常从抽象 class 或接口扩展而来,但是当我测试时我意识到在我的情况下不需要那样做,什么我需要的是具有常见行为的具体 class,然后是我的子classes 与其余部分。

class Book
{
    /* 
      All properties like title, authors, publicationDate
      here, with the corresponding methods.
    */
}

class ElectronicBook extends Book
{
    //...
}

class PaperBook extends Book
{
    //...
}

class 实例化仍然派生到子classes,所以我真的相信这是一个工厂方法实现,但我可以通过这种方式找到另一个示例代码。

所以问题是:这仍然是工厂方法实现吗?如果不是为什么?

这是非常主观的,但我认为您不需要任何继承就可以将其作为工厂方法。这实际上足以满足定义:

class Book { 

}

class BookFactory {

   function createBook() {

     return new Book();    

   }

}

当您需要更改用于创建具体对象的代码时,就需要抽象(使用接口或抽象 class)。这在出现诸如编写单元测试或您需要添加更多产品 (or/and) 创建者等情况时特别有用。

有趣的是,工厂和工厂方法之间存在差异。工厂是将创建部分封装到 class 中的方法,该方法具有负责创建部分的方法。另一方面,Factory Methods被赋予"Creators"用于创建"Product(s)",这可以由创建者决定。创建产品的方法,比如 createProduct(),通常在 Creator 内部(通过使用继承诱导),其他方法的目的通常是处理由工厂方法创建的产品。

现在,在创建者和产品中,我们都使用一种平行的层次结构,因此创建者不依赖于(或知道产品是如何创建的)具体产品,并且产品也不知道创建者。这有助于实现松散耦合的代码(此处,CHANGE 不会相互影响)。

希望这对您有所帮助。

您可以在以下位置阅读更多信息: