我正在尝试理解工厂设计模式。
我不明白为什么在客户和产品(客户想要的对象)之间有一个中间人是好的。
没有工厂的示例:
$mac = new Mac();以工厂为例:
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');工厂模式如何将客户端与产品解耦?
有没有人能举一个例子,说明未来的代码更改会对示例1产生负面影响,但对示例2会产生积极影响,这样我就能理解解耦的重要性?
谢谢。
发布于 2010-04-24 13:02:29
我认为这与构造某些类型的对象所需的资源有关。
在非正式的情况下,如果您让某人构建一台Mac,这将是一个艰苦的过程,需要多年的设计、开发、制造和测试,而且可能无法正确完成。这一过程将不得不对每一个单独的Mac重复。然而,如果你引入一家工厂,所有的艰苦工作只需一次就可以完成,那么Mac电脑的生产成本就会更低。
现在考虑Joomla的factory.php。据我所知,JFactory的主要目的是池化对象,并确保应该相同的对象不会被复制。例如,JFactory::getUser()将返回一个且只有一个对象的引用。如果用户对象中的某些内容发生了更改,它将出现在所有地方。还要注意,JFactory::getUser()返回的是引用,而不是新对象。这是使用构造函数不能做的事情。
通常,在构造对象时需要本地上下文,而该上下文可能会持久存在,并可能采取多种形式。例如,可能有一个保存用户的MySQL数据库。如果用户对象是使用构造函数创建的,则需要将Database对象传递给构造函数(或使其依赖于全局变量)。如果您决定将应用程序切换到PostgreSQL,则数据库对象的语义可能会更改,从而导致需要检查构造函数的所有使用情况。全局变量让我们隐藏这些细节,工厂也是如此。因此,用户工厂会将构造用户对象的细节与需要用户对象的位置解耦。
工厂什么时候会有帮助?当构造一个对象时涉及到背景细节。什么时候构造函数更好?当全局变量足够时。
发布于 2010-04-24 12:55:31
不知道我能不能把它说得比IBM的https://www.ibm.com/developerworks/library/os-php-designptrns/#N10076更好。
发布于 2010-04-24 13:08:31
此示例返回类型为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即可。
https://stackoverflow.com/questions/2703262
复制相似问题