我正在阅读有效的java并且编写的静态工厂方法的一个优点是它们可以返回任何子类型的返回类型的对象。 我理解了我们实现这一点的方式,如以下链接中所述。 https://www.slideshare.net/mysky14/java-static-factory-methods
但是在本书中给出了一个Collections API的例子,该例子在java.util.Collections实用程序类中有静态工厂方法,并写成“Collections API比它导出32个单独的公共类时要小得多”。
还提到,通过这种方式,API可以返回对象,而不会将其类公开,这会导致API非常紧凑。
我想通过实现此方法并且没有单独的公共类来了解如何减小API大小。
答案 0 :(得分:0)
通常,使用静态工厂方法会从您的类中取出对象实例化逻辑。假设基于某些逻辑,您需要返回不同的子类对象。这将导致类方法中的if-else逻辑,无论哪个负责适当的对象实例化。将其转移到静态工厂方法将导致更清晰的类设计,这将更容易测试并且更接近"关闭到修改"原理
答案 1 :(得分:0)
我想通过实现此方法并且没有单独的公共类来了解如何减小API大小。
让我们使用本书中使用的相同具体示例:java.util.EnumSet
具有返回两种实现之一的静态工厂:RegularEnumSet
或JumboEnumSet
。这些实现有其自身的复杂性,但有效地隐藏给Collections的客户端。从理论上讲,工厂将来可以使用其他实现,并且它们的客户不会受到影响。
如果您在类图中可视化,工厂方法(例如,of()
,而不是构造函数)返回抽象类型EnumSet
,它隐藏了实施细节。抽象(或接口)类型有效地抽象(简化)API。
更重要的是,这些实现实际上是包私有,这意味着它们在没有public
关键字的情况下声明。这意味着只有同一个包中的类才能看到它们,因此它可以防止Client
依赖它们。这是信息隐藏的一个很好的例子,它允许API开发人员简化他们的API,并在以后更改隐藏的部分而不会破坏代码。
另一个让我们想到工厂方法可以简化API的例子是Collections中的具体迭代器。在这种情况下,它是一个非静态的工厂方法,例如ArrayList.iterator()
,它返回ArrayLists的具体迭代器。这个班级的名字更少"已知"而不是EnumSet
实现。