首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的服务提供者框架

java中的服务提供者框架
EN

Stack Overflow用户
提问于 2016-10-23 13:40:35
回答 2查看 1.1K关注 0票数 4

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-10-23 14:45:13

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

解释这句话的含义的一个好方法是考虑EnumSet类型,它是java.util包中的一个类。

EnumSet是一个抽象类,没有任何可访问的构造函数。为了获得一个EnumSet实例,程序员使用它的一个静态工厂方法,例如。EnumSet.of( ... )。例如:

代码语言:javascript
复制
Set<MyEnum> s = EnumSet.of(MyEnum.FIRST_CONSTANT);

of()方法返回的对象没有EnumSet的实现类型。相反,实现类型依赖于MyEnum类。如果MyEnum有64个或更少的常量,那么of()返回的对象的类型是RegularEnumSet。如果MyClass有超过64个常量,则返回的对象类型为JumboEnumSet。然而,返回的对象的实际类型对程序员并不感兴趣。他或她所关心的就是获得某种类型的对象,这些对象符合EnumSet契约。

现在,假设五年后,Java语言架构师决定有另一种EnumSet实现类型很重要,例如,对于常量非常多(超过1024)的类来说,缓存枚举实现是很重要的。他们编写这个类来遵循EnumSet契约,并称之为:

代码语言:javascript
复制
final CachedEnumSet extends EnumSet {
    :
    :
}

尽管在编写CachedEnumSetEnumSet并不存在,但是使用静态工厂可以实现基于契约的实现系统这一事实使EnumSet架构师能够在几年后添加这个新的实现。

现在,当客户端调用EnumSet.of()时,他或她可以得到一个RegularEnumSet对象、一个JumboEnumSet对象或新的CachedEnumSet对象,但是他们不会在意,因为他们得到的对象仍然是EnumSet的一个子类型,并且受它的契约管辖。

票数 9
EN

Stack Overflow用户

发布于 2016-10-23 14:07:58

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

以身作则可能是最简单的。JDBC示例类似于DriverManager --您提供了一个数据库连接URL。从该URL中,DriverManager需要确定返回哪个类。如果您使用的是Oracle数据库,它会创建一个Oracle驱动类(它实现JDBC ),尽管DriverManager不知道任何关于Oracle的具体情况。

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

每天都有很多这样的例子发生: JDBC提供程序、自定义日志添加程序、XML提供程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40203567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档