java中的服务提供者框架

时间:2016-10-23 13:40:35

标签: java

根据“Effecive java”一书,语句“ 静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时 。“在以下段落中表示:

静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时。这种灵活的静态工厂 方法构成了服务提供者框架的基础,例如Java数据库 连接API(JDBC)。服务提供者框架是一个系统 多个服务提供者实现服务,系统进行实现 可供客户使用,将它们与实现分离

2 个答案:

答案 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 {
    :
    :
}

尽管编写CachedEnumSetEnumSet不存在,但使用静态工厂启用基于合同的实现系统这一事实使Java架构师能够在几年后添加此新实现。

现在,当客户端调用EnumSet.of()时,他或她可以获得RegularEnumSet个对象,JumboEnumSet个对象或新的CachedEnumSet对象,但他们不会关心,因为他们获得的对象仍然是EnumSet的子类型,并受其合同约束。

答案 1 :(得分:2)

工厂方法通常会返回一个实现接口的类(或者扩展类,同样的结果)。但是可以动态定义要返回的实际类。在这种情况下,写入工厂方法时不需要存在要返回的类。

可能是最简单的例子。 JDBC示例类似于DriverManager - 您提供数据库连接URL。从该URL,DriverManager需要确定要返回的类。如果您正在使用Oracle数据库,它会创建一个Oracle驱动程序类(实现JDBC API),即使DriverManager对Oracle没有任何了解。

作为一般情况,假设我们的工厂方法返回接口AA。工厂方法的实现可能会读取定义要创建的类的配置文件,然后使用反射在运行时创建该类。定义的类只需要存在于CLASSPATH中。工厂方法知道如何创建它,但是在编写工厂方法时实现并不存在。

有很多日常例子会发生这种情况:JDBC提供程序,自定义日志记录附加程序,XML提供程序。