所有工厂方法都应该是 public 吗?

Should all factory methods be public?

根据spryker/architecture-sniffer中的规则:

All the factory methods should be public by default

有什么好的论据吗?我以前在使用工厂模式时从未偶然发现这一点。

看起来他们对“工厂”的定义只不过是一个特定 class 名称的列表。

https://github.com/spryker/architecture-sniffer/blob/64ec598e65cccef7ec72bfdc88d241663a42bfb1/src/Common/Factory/AbstractFactoryRule.php#L23

一般来说,工厂没有理由必须是 public。请注意 在实施方面差异很大,您可能会看到阳光下的每一种创造模式都被称为“工厂”。这个词本身太宽泛了,几乎没有任何意义。

此规则主要与Spryker SCOS核心开发有关。

Spryker OS 的这一部分是一个基于 PHP 的电子商务框架。作为一个框架,它旨在提供更好的定制和扩展能力。因此,关于工厂方法公开可见性的严格规则支持用户完全控制每个模块中发生在工厂中的依赖注入。

此规则对于旨在实现高可定制性的常见 OSS 库也很有用。它意味着对定制业务逻辑“隐藏”的限制,需要工程师有意识地选择退出。在 Sprykers 案例中,合作伙伴网络将使用这种方法来提供高度可定制的集成模块。

对于典型的 PHP 项目用例,此规则可能不太有用甚至无用,与项目开发的保护性本质相悖。

UPD:让我们举个例子。 Order 可以是一个包含多个依赖项的复杂对象,例如 Order Item。从一开始就可以访问所有部分使项目更容易并增强可升级性:如果 Core 决定通过将可见性修饰符从 protected 切换为 public 从外部访问工厂方法,则不会出现 BC-break。因此可以安全地自定义工厂方法。