0

我正在实现工厂方法模式,但是检查了几个示例,我无法确定为产品扩展具体类而不是创建抽象类或接口是否正确......这只是一个示例(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 Book
{
    /* 
      All properties like title, authors, publicationDate
      here, with the corresponding methods.
    */
}

class ElectronicBook extends Book
{
    //...
}

class PaperBook extends Book
{
    //...
}

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

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

4

2 回答 2

1

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

有趣的是,工厂方法和工厂方法之间存在差异。工厂是将创建部分封装到具有处理创建部分的方法的类中的方法。另一方面,工厂方法被赋予“创建者”以创建“产品”,这可以由创建者决定。创建产品的方法,比如说 createProduct(),通常在 Creator 内部,(通过使用继承来诱导),其他方法的目的通常是在产品上工作,由工厂方法创建。

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

希望这可以帮助。

你可以阅读更多:

于 2015-09-08T18:02:44.817 回答
0

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

class Book { 

}

class BookFactory {

   function createBook() {

     return new Book();    

   }

}
于 2015-09-07T15:30:45.217 回答