【问题标题】:Service provider framework in javajava中的服务提供者框架
【发布时间】:2017-03-05 08:30:00
【问题描述】:

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

    解释这句话含义的一个好方法是考虑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 {
        :
        :
    }
    

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

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

    【讨论】:

      【解决方案2】:

      工厂方法通常会返回一个实现接口的类(或扩展一个类,无论哪种方式都相同)。但是要返回的实际类可以动态定义。这样的话,在写工厂方法的时候,要返回的类就不需要存在了。

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

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

      这种事情发生的日常示例很多:JDBC 提供程序、自定义日志记录附加程序、XML 提供程序。

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 1970-01-01
        • 2023-03-28
        • 2012-08-07
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多