我正在努力了解工厂的设计模式.
我不明白为什么在客户端和产品(客户想要的对象)之间有一个中间人是好的.
没有工厂的例子:
$mac = new Mac();
工厂的例子:
$appleStore = new AppleStore(); $mac = $appleStore->getProduct('mac');
工厂模式如何将客户与产品分离?
有人可以给出一个未来代码更改的例子,它将影响示例1的否定,但在示例2中是正面的,所以我理解解耦的重要性?
谢谢.
我认为这与构建某些类型的对象所需的资源有关.
非正式地说,如果你告诉某人建造一台Mac,这将是一个艰苦的过程,需要多年的设计,开发,制造和测试,而且可能做得不对.每个Mac都必须重复此过程.但是,如果你介绍一个工厂,所有的辛勤工作只能做一次,那么Mac可以更便宜地生产.
现在考虑Joomla的factory.php.据我所知,JFactory的主要目的是汇集对象并确保不会复制应该相同的对象.例如,JFactory :: getUser()将返回对一个且仅一个对象的引用.如果该用户对象中的某些内容发生了变化,它将随处出现.另请注意,JFactory :: getUser()返回引用,而不是新对象.这是你无法用构造函数做的事情.
通常,在构造对象时需要本地上下文,并且该上下文可能会持久存在并可能采用多种形式.例如,可能有一个MysqL数据库保存用户.如果使用构造函数创建User对象,则需要将Database对象传递给构造函数(或者让它依赖于全局变量).如果您决定将应用程序切换到Postgresql,则Database对象的语义可能会发生变化,从而导致需要检查构造函数的所有用法.全局变量让我们隐藏这些细节,工厂也是如此.因此,用户工厂会将构造User对象的细节与需要User对象的位置分离.
工厂什么时候有用?构造对象时涉及背景细节.什么时候构造者更好?当全局变量足够时.