根据“Effecive java”一书,语句“ 静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时 。“在以下段落中表示:
静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时。这种灵活的静态工厂 方法构成了服务提供者框架的基础,例如Java数据库 连接API(JDBC)。服务提供者框架是一个系统 多个服务提供者实现服务,系统进行实现 可供客户使用,将它们与实现分离
答案 0 :(得分:7)
按照“有效的java”这本书的说法是什么 静态工厂方法返回的对象甚至不需要存在 写入包含该方法的类的时间。“表示在 以下段落:
解释这句话的含义的一个好方法是考虑EnumSet
类型,它是java.util
包中的一个类。
EnumSet
是一个没有任何可访问构造函数的抽象类。为了获得EnumSet
实例,程序员使用其静态工厂方法之一,例如。 EnumSet.of( ... )
。例如:
Set<MyEnum> s = EnumSet.of(MyEnum.FIRST_CONSTANT);
of()
方法返回的对象的实现类型不是EnumSet
。相反,实现类型取决于MyEnum
类。如果MyEnum
的常量为64或更少,则of()
返回的对象类型为RegularEnumSet
。如果MyClass
具有超过64个常量,则返回的对象类型为JumboEnumSet
。但是,返回的对象的实际类型对程序员来说并不重要。他或她所关心的只是获得符合EnumSet
合同的某种类型的对象。
现在,让我们说,哦,五年后,Java语言架构师决定拥有另一个EnumSet
实现类型很重要,比如说,例如,对于非常大的类的缓存枚举实现常量数(超过1024)。他们写这个课程是为了遵循EnumSet
合同并称之为:
final CachedEnumSet extends EnumSet {
:
:
}
尽管编写CachedEnumSet
时EnumSet
不存在,但使用静态工厂启用基于合同的实现系统这一事实使Java架构师能够在几年后添加此新实现。
现在,当客户端调用EnumSet.of()
时,他或她可以获得RegularEnumSet
个对象,JumboEnumSet
个对象或新的CachedEnumSet
对象,但他们不会关心,因为他们获得的对象仍然是EnumSet
的子类型,并受其合同约束。
答案 1 :(得分:2)
工厂方法通常会返回一个实现接口的类(或者扩展类,同样的结果)。但是可以动态定义要返回的实际类。在这种情况下,写入工厂方法时不需要存在要返回的类。
可能是最简单的例子。 JDBC示例类似于DriverManager - 您提供数据库连接URL。从该URL,DriverManager需要确定要返回的类。如果您正在使用Oracle数据库,它会创建一个Oracle驱动程序类(实现JDBC API),即使DriverManager对Oracle没有任何了解。
作为一般情况,假设我们的工厂方法返回接口AA。工厂方法的实现可能会读取定义要创建的类的配置文件,然后使用反射在运行时创建该类。定义的类只需要存在于CLASSPATH中。工厂方法知道如何创建它,但是在编写工厂方法时实现并不存在。
有很多日常例子会发生这种情况:JDBC提供程序,自定义日志记录附加程序,XML提供程序。