具有非抽象产品的方法工厂
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 不会相互影响)。
希望这对您有所帮助。
您可以在以下位置阅读更多信息:
我正在实施工厂方法模式,但检查了几个示例后我无法确定为产品扩展具体 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 不会相互影响)。
希望这对您有所帮助。
您可以在以下位置阅读更多信息: