首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建对象的工厂有什么好处?

创建对象的工厂有什么好处?
EN

Stack Overflow用户
提问于 2010-04-24 12:50:36
回答 3查看 285关注 0票数 6

我正在尝试理解工厂设计模式。

我不明白为什么在客户和产品(客户想要的对象)之间有一个中间人是好的。

没有工厂的示例:

代码语言:javascript
复制
$mac = new Mac();

以工厂为例:

代码语言:javascript
复制
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');

工厂模式如何将客户端与产品解耦?

有没有人能举一个例子,说明未来的代码更改会对示例1产生负面影响,但对示例2会产生积极影响,这样我就能理解解耦的重要性?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-24 13:02:29

我认为这与构造某些类型的对象所需的资源有关。

在非正式的情况下,如果您让某人构建一台Mac,这将是一个艰苦的过程,需要多年的设计、开发、制造和测试,而且可能无法正确完成。这一过程将不得不对每一个单独的Mac重复。然而,如果你引入一家工厂,所有的艰苦工作只需一次就可以完成,那么Mac电脑的生产成本就会更低。

现在考虑Joomla的factory.php。据我所知,JFactory的主要目的是池化对象,并确保应该相同的对象不会被复制。例如,JFactory::getUser()将返回一个且只有一个对象的引用。如果用户对象中的某些内容发生了更改,它将出现在所有地方。还要注意,JFactory::getUser()返回的是引用,而不是新对象。这是使用构造函数不能做的事情。

通常,在构造对象时需要本地上下文,而该上下文可能会持久存在,并可能采取多种形式。例如,可能有一个保存用户的MySQL数据库。如果用户对象是使用构造函数创建的,则需要将Database对象传递给构造函数(或使其依赖于全局变量)。如果您决定将应用程序切换到PostgreSQL,则数据库对象的语义可能会更改,从而导致需要检查构造函数的所有使用情况。全局变量让我们隐藏这些细节,工厂也是如此。因此,用户工厂会将构造用户对象的细节与需要用户对象的位置解耦。

工厂什么时候会有帮助?当构造一个对象时涉及到背景细节。什么时候构造函数更好?当全局变量足够时。

票数 5
EN

Stack Overflow用户

发布于 2010-04-24 12:55:31

不知道我能不能把它说得比IBM的https://www.ibm.com/developerworks/library/os-php-designptrns/#N10076更好。

票数 2
EN

Stack Overflow用户

发布于 2010-04-24 13:08:31

此示例返回类型为Mac的对象,并且它永远不能有任何不同:

代码语言:javascript
复制
$mac = new Mac();

它不能是Mac的子类,也不能是与Mac接口匹配的类。

而下面的示例可能会返回Mac类型的对象或工厂认为合适的任何其他类型的对象。

代码语言:javascript
复制
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');

您可能需要一组Mac的子类,每个子类代表一个不同的Mac模型。然后在工厂中编写代码来决定使用这些子类中的哪一个。您不能使用new运算符做到这一点。

因此,工厂在创建对象时为您提供了更大的灵活性。灵活性通常与解耦密切相关。

你的评论:我不会说永远不要使用new。事实上,我确实使用new来创建大多数简单的对象。但这与谁编写客户端代码没有任何关系。工厂模式适用于需要能够选择动态实例化类的体系结构的情况。

在Apple Store示例中,您可能需要一些简单的代码来实例化产品并将其添加到购物车中。如果您使用new,并且每个不同的产品类型都有不同的对象类型,那么您就必须编写一个庞大的case语句,以便创建一个具有适当类型的new对象。每次添加产品类型时,都必须更新该case语句。而且在应用程序的其他部分中可能有几个这样的case语句。

通过使用工厂,您将只有一个地方可以更新,那就是知道如何获取参数并实例化正确类型的对象。你的应用程序中的所有地方都将隐式地获得对新类型的支持,而不需要更改代码。无论您是唯一的开发人员还是团队中的一员,这都是一个胜利。

但同样,如果您不需要支持各种子类型,则不需要工厂。在简单的情况下继续使用new即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2703262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档