Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建对象的工厂的好处是什么?_Php_Design Patterns - Fatal编程技术网

Php 创建对象的工厂的好处是什么?

Php 创建对象的工厂的好处是什么?,php,design-patterns,Php,Design Patterns,我试图理解工厂的设计模式 我不明白为什么在客户和产品(客户想要的对象)之间有一个中间人是好的 没有工厂的示例: $mac = new Mac(); 以工厂为例: $appleStore = new AppleStore(); $mac = $appleStore->getProduct('mac'); 工厂模式如何将客户机与产品分离 有人能举一个例子说明将来的代码更改会对示例1产生负面影响,但在示例2中会产生正面影响,这样我就理解了解耦的重要性了 谢谢。我不知道我是否能比IBM做得更好

我试图理解工厂的设计模式

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

没有工厂的示例:

$mac = new Mac();
以工厂为例:

$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
工厂模式如何将客户机与产品分离

有人能举一个例子说明将来的代码更改会对示例1产生负面影响,但在示例2中会产生正面影响,这样我就理解了解耦的重要性了


谢谢。

我不知道我是否能比IBM做得更好

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

非正式地说,如果你告诉某人要建造一台Mac电脑,这将是一个艰苦的过程,需要多年的设计、开发、制造和测试,而且可能做得不对。这一过程必须对每一个Mac重复。然而,如果你引进一家工厂,所有的艰苦工作只需一次,那么苹果电脑的生产成本就会更低

现在考虑JoOMLA。据我所知,JFactory的主要目的是汇集对象,并确保不复制应该相同的对象。例如,
JFactory::getUser()
将返回对一个且仅一个对象的引用。如果用户对象中的某些内容发生了更改,它将显示在任何地方。另外,请注意
JFactory::getUser()
返回一个引用,而不是一个新对象。这是你用构造函数做不到的

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


工厂什么时候有用?当构建对象时涉及背景细节。什么时候建设者更好?当全局变量足够时。

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

$mac = new Mac();
它不能是
Mac
的子类,也不能是与
Mac
接口匹配的类

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

$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
您可能需要一组
Mac
的子类,每个子类代表不同的Mac模型。然后在工厂中编写代码来决定使用这些子类中的哪一个。您不能使用
new
操作符执行此操作

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


您的评论是:我不会说永远不要使用
new
。事实上,对于大多数简单对象的创建,我确实使用了
new
。但这与谁在编写客户机代码无关。工厂模式适用于需要一个可以选择动态实例化类的体系结构的情况

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

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


但是,如果您不需要支持各种子类型,那么您也不需要工厂。在简单的情况下继续使用
new

第二个对我来说更像是一种关系,而不是一个工厂…?但这不是所谓的“将流程转移到中心位置”。我不明白的是decouple这个词。但是如果我需要更改数据库,并且我使用工厂,我仍然需要更改工厂中的代码。这部分我不太明白。不管怎样,我必须改变,现在我只是把它移到了另一个类,工厂。我可以理解,如果处理框架/操作系统应用程序,这是很好的。与代码交互的用户不必重写他们的代码。但是如果我是唯一一个使用我写的代码的人,那么工厂如何更好呢?如果我更改了数据库,我仍然需要更改。有什么更好的?在一个地方更改一组代码,或者在很多地方更改一组代码?因此,重点是“如何编写代码,以便无论何时更改代码,客户都不必这样做”?因此,基本上我不希望客户在“最终产品”上使用新产品。我想为产品的创建提供一个抽象层(工厂)。所以他不必知道幕后发生了什么?我说得对吗?但是当我自己编写所有代码的时候呢?不管怎样,我必须改变。我不太明白重点在哪里,或者我作为一个开发人员想要做什么。