2010-04-24 58 views
6

我想了解工厂的设计模式。有创建对象工厂的好处吗?

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

例如无工厂:

$mac = new Mac(); 

例如有一家工厂:

$appleStore = new AppleStore(); 
$mac = $appleStore->getProduct('mac'); 

如何工厂模式从产品分离的客户端?

可能有人给将来的代码更改,将在例1中的负面影响的例子,但例如2正让我明白了脱钩的重要性?

谢谢。

+1

第二个人似乎更像是一种关系而不是工厂对我......? – SeanJA 2010-04-24 04:53:22

回答

5

我认为这与构建某些类型的对象所需的资源来做。

通俗地说,如果你告诉别人打造一台Mac,这将是一个艰苦的过程,将需要数年的设计,开发,制造和测试的,它可能不会做的权利。这个过程将不得不为每一台Mac重复。然而,如果你引进一家工厂,所有的辛苦工作只能完成一次,然后Mac可以更便宜地生产。

现在考虑Joomla的factory.php。根据我所知道的,JFactory的主要目的是汇集对象并确保应该相同的对象不被复制。例如,JFactory::getUser()将返回对唯一一个对象的引用。如果该用户对象中的某些内容发生更改,它将出现在任何地方。另请注意,JFactory::getUser()返回一个引用,而不是一个新的对象。这是你无法用构造函数完成的事情。

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

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

+1

+1类比奖金 – SeanJA 2010-04-24 05:03:29

+0

但这不是所谓的“移动过程到中央的地方”。我不明白的是解耦这个词。 – 2010-04-24 05:13:19

+0

但如果我需要更改数据库和即时通讯使用工厂,我仍然需要在工厂更改我的代码。这是我不太明白的部分。无论哪种方式,我必须改变,现在我只是把它移到另一个班级,工厂。我可以理解,如果处理框架/ os应用程序,这是很好的。您的用户与您的代码交互不必重写他们的代码。但如果我是唯一一个使用我写的代码的工厂,那么工厂怎么样更好呢?如果我更改数据库,我仍然需要更改。 – 2010-04-24 05:40:15

1

本示例返回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

+0

所以关注点在于“每当我更改我的代码时,我该如何编写代码,CLIENT不必”?所以基本上我从不希望客户在“最终产品”上使用新的。我想为创建产品提供一个抽象层(工厂)。所以他不必知道幕后发生了什么?我对么?但是当我自己编码一切时呢?无论如何,我必须改变。我不太清楚重点在哪里,或者我作为开发人员想做什么。 – 2010-04-24 05:18:43

相关问题