【发布时间】:2021-08-24 01:40:18
【问题描述】:
我正在读一本书,上面写着:
// code smell
public interface IProductRepositoryFactory {
IProductRepository Create();
}
抽象工厂创建的依赖项在概念上应该需要一个运行时值,并且从运行时值到抽象的转换应该是有意义的。 通过使用无参数指定 IProductRepositoryFactory 抽象 创建方法,你让消费者知道给定的实例还有更多 服务,并且它必须处理这个问题。因为 IProductRepository 的另一个实现可能根本不需要多个实例或确定性处置, 因此,您通过抽象工厂泄露了实现细节 无参数创建方法。
这里我有点疑惑,“给定服务的更多实例”是什么意思,是不是意味着你多次调用了一个具体的Factory的Create方法?那有什么问题?即使您的工厂方法确实具有以下参数:
public interface IProductRepositoryFactory {
IProductRepository Create(string type);
}
如果你多次调用具体工厂的 Create 方法,也会有多个实例。那么无参数工厂方法有什么问题呢?它泄漏了什么?
【问题讨论】:
-
如果您对此进行更多研究,我认为您将从这个过程中获得更多信息和更有价值的信息。是的,我们可以回答一个问题,并可能给您一个很好的答案,但是这个过程对您来说很慢,而且您在这个过程中丢失了所有其他相关信息。其次,我们无法告诉你作者在极端情况下的想法。此外,这些都是时尚问题,stackoverflow 更多的是关于具体的答案和解决方案,这既不适合也可能更适合软件工程
-
我认为在评估这段摘录时有两点需要注意。首先是建议特定于给定的示例。这不是关于模式的一般建议,而是关于特定上下文中特定实现的建议。换句话说,重点不在于无参数的
Create方法是all 泄漏抽象。这个例子恰好是一个。其次,这个示例不是 GoF 模式。这种抽象工厂的退化形式很常见,但不满足书中定义的标准。
标签: c# design-patterns factory