我们是不是需要以抽象工厂模式向客户公开具体工厂

Posted

技术标签:

【中文标题】我们是不是需要以抽象工厂模式向客户公开具体工厂【英文标题】:Do we need to expose concrete factory to client in abstract factory pattern我们是否需要以抽象工厂模式向客户公开具体工厂 【发布时间】:2017-03-20 02:00:41 【问题描述】:

我在网上学习抽象工厂模式,有一个基本问题。大多数类图(包括Wikipedia 上的一个)显示客户端引用的是 AbstractFactory 和 AbstractProduct。客户实际上并没有对具体工厂的引用。但是,我在互联网上看到的大多数code 在客户端代码或主方法中创建具体工厂的实例。那是正确的实现吗?客户不只需要了解抽象工厂和抽象产品吗?

【问题讨论】:

这样抽象的问题是不可能回答的。工厂是创造模式。他们创建对象。就是这样。其他一切都超出了他们的范围, Why do we need Abstract factory design pattern?的可能重复 【参考方案1】:

"我们是否需要在 abstract 工厂中向客户公开 concrete 工厂 模式”

显然不会,否则会破坏模式的目的,从而防止轻松地将一个工厂交换为另一个(以及一个对象系列与另一个)。

我在互联网上看到的几乎所有代码都在客户端代码或主方法中创建具体工厂的实例

代码中必须有一个具体工厂被实例化的地方,但那应该是在Composition Root 中。其他任何地方都会出错。

【讨论】:

+1 表示组合根。我遇到的另一个术语是wiring。基于客户端环境的某些属性,可以使用相应的具体工厂,而无需客户端知道具体工厂类。抽象工厂模式的主要目的是隐藏属于环境的实际具体产品。如果将相同的代码移植到另一个环境或修改了底层产品类,这可以简化维护。我觉得具体工厂类的暴露可以放松,尽管最好它们保持隐藏。

以上是关于我们是不是需要以抽象工厂模式向客户公开具体工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式--抽象工厂模式

抽象工厂模式

设计模式之-抽象工厂模式

创建型模式 抽象工厂

设计模式-抽象工厂模式

抽象工厂模式