它是否将责任委托给工厂类,而不是子类,是否正确?

时间:2013-06-07 17:59:23

标签: design-patterns factory-pattern

我正在阅读有关工厂模式的内容,并了解它的概念和实现。但这个定义令我感到困惑。有人可以澄清一下吗?

定义:工厂模式是定义用于创建对象的接口,但是将对象创建委托给子类。

我很困惑将对象创建委托给子类。它将工厂类的责任委托给子类正确吗?

3 个答案:

答案 0 :(得分:1)

我还不能发表评论。否则这将是一个评论。

我的建议是彻底阅读本文Is this correct object oriented programming in php?。他努力建立工厂模式。对于上下文,您可能最好阅读整个线程。它不是那么长,而且非常具有启发性。

答案 1 :(得分:1)

阅读:工厂模式是定义用于创建对象的接口,但将对象创建委托给工厂类的

注意:工厂类的子类

您从课程开始:CheeseCakeFactory。你有一个像它的实例:

CheeseCakeFactory theFactory = new CheeseCakeFactory();       .......  (1)

然后你做:

Cake aCake = theFactory.createCake();                         .......  (2)

在这里我同意你的看法,创作的任务被委托给了工厂。但现在再考虑第一行:

CheeseCakeFactory theFactory = new SweetCakeFactory();        .......  (3)

我们假设SweetCakeFactory继承CheeseCakeFactory 只需改变工厂的具体实施,最终创建的产品就会发生变化。现在第二行将要求子类创建对象。这就是为什么我们说实例化的责任被委托给子类。

答案 2 :(得分:0)

尝试以这种方式分解定义,

  

Factory模式用于定义用于创建对象的接口(...)

首先定义一个界面,比如说,

interface IObjectFactory
{
    object CreateObject();
}

此接口基本上将定义工厂的功能以及它创建的对象类型。但是,它仍然是一个接口,所以要消耗它,首先需要实现它。

因此,

  

(...)但是将对象创建委托给子类。

在这里,我认为问题在于子类的措辞:interfaces 不能具有子类,因为它们是不是类,它们是接口。此外,整个句子看起来像冗余,因为接口必须总是将实现委托给一个类。

如果你看一下the definition on Wikipedia for Factory pattern,你会发现它看起来很相似,但却传达了实际意义:

  

此模式的本质是“定义用于创建对象的接口,但让实现接口的类决定实例化哪个类.Pool方法允许类延迟实例化到子类。