【问题标题】:Method Factory with Non Abstract Product具有非抽象产品的方法工厂
【发布时间】:2015-09-07 15:25:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: php design-patterns factory-method


    【解决方案1】:

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

    知道工厂方法和工厂方法之间存在差异是很有趣的。工厂是将创建部分封装到具有处理创建部分的方法的类中的方法。另一方面,工厂方法被赋予“创建者”以创建“产品”,这可以由创建者决定。创建 Product 的方法,比如 createProduct(),通常在 Creator 内部,(通过继承引入),而其他方法的意图通常是在工厂方法创建的产品上工作。

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

    希望这会有所帮助。

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

    【讨论】:

      【解决方案2】:

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

      class Book { 
      
      }
      
      class BookFactory {
      
         function createBook() {
      
           return new Book();    
      
         }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-05
        • 2014-01-14
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多