我正在实现Factory Method模式,但是检查那里的几个例子我无法确定是否扩展产品的具体类而不是创建抽象类或接口是正确的...这只是用于一个例子(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
{
//...
}
类实例化仍然是派生到子类,所以我真的相信这是一个Factory Method实现,但我可以用这种方式找到另一个示例代码。
所以问题是:这仍然是工厂方法的实现吗?如果不是为什么?
答案 0 :(得分:1)
当您需要更改用于创建具体对象的代码时,需要进行抽象(使用接口或抽象类)。当出现诸如编写单元测试或需要添加更多产品(或/和)创建者的情况时,这尤其有用。
有趣的是,工厂和工厂方法之间存在差异。工厂是将创建部分封装到具有负责创建部分的方法的类中的方法。另一方面,工厂方法被赋予“创作者”以创建“产品”,这可以由创建者决定。创建Product的方法,比如createProduct(),通常在Creator中,(通过使用继承引起),其他方法的意图通常是在工厂方法创建的产品上工作。
现在,在创作者和产品中,我们使用并行的层次结构,以便创建者不依赖(或知道产品是如何创建的)混凝土产品和产品也不知道创建者。这有助于实现松散耦合的代码(此处,CHANGE不会相互影响)。
希望这会有所帮助。
您可以在以下网址阅读更多内容:
答案 1 :(得分:0)
这是非常主观的,但我认为你不需要继承它作为工厂方法。这实际上足以满足定义:
class Book {
}
class BookFactory {
function createBook() {
return new Book();
}
}