一、,EffectiveJava3rd条目一.静态工厂的第5个优点是,在编写包含该方法的类时,返回的对象的类不需要存在。 下文转自 https://www.cnblogs.com/fireway/p/7215845.html 服务提供者框架模式

静态工厂的第5个优点是,在编写包含该方法的类时,返回的对象的类不需要存在。这种灵活的静态工厂方法构成了服务提供者框架的基础,比如Java数据库连接API(JDBC)。服务提供者框架是提供者实现服务的系统,并且系统使得实现对客户端可用,从而将客户端从实现中分离出来。



服务提供者框架中有三个基本组:服务接口,它表示实现;提供者注册API,提供者用来注册实现;以及服务访问API,客户端使用该API获取服务的实例。服务访问API允许客户指定选择实现的标准。在缺少这样的标准的情况下,API返回一个默认实现的实例,或者允许客户通过所有可用的实现进行遍历。服务访问API是灵活的静态工厂,它构成了服务提供者框架的基础。

SPF 包括以下组件:(1) 服务接口;(2) 服务提供者注册接口;(3)服务访问接口;(4)服务提供者接口(可选)。

  以JDBC 为例:

  Driver:服务提供者接口

  DriverManager.registerDriver():服务提供者注册接口

  DriverManager.getConnection():服务访问接口

  Connection():服务接口

转 服务提供者框架模式






服务提供者框架模式

service provider frameworks - 服务提供者框架: 多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来。

SPF 包括以下组件:

组件说明
服务接口(Service Interface )这是提供者实现的
提供者注册API(Provider Registration API)这是系统用来注册实现,让客户端访问
服务访问API(Service Access API)是客户端用来获取服务的实例的

服务访问API一般允许但是不要求客户端指定某种选择提供者的条件,如果没有这样的规定,API就会返回默认实现的一个实例

服务访问API是“灵活的静态工厂”,它构成了SPF的基础

服务提供者接口(Service Provider Interface)负责创建其服务实现的实例

示例: SPFTest

通过上面的例子可以看出,我们只需要输入一个key就可以得到对应的类的实例,进而使用该类的方法,这种方法能大大降低代码的耦合度,这里的Map集合可以理解为服务提供者框架的注册机制,Map中的Key和Value的值都应该在配置的属性文件(properties)中,这样方便我们查看和添加服务类,我们只需要操作这个配置文件就可以了,这样我们的实际模式实现了java的解耦合问题。

服务接口的具体实现类和服务提供者接口的实现类都是服务提供者自己去实现。以JDBC为例,这2个模块由具体的数据库提供商来实现。

示例:JDBC(Java数据库连接,Java Database Connectivity)

加载驱动程序:

1 Class.forName(driverClass);
2 //加载MySql驱动
3 Class.forName("com.mysql.jdbc.Driver");
4 //加载Oracle驱动
5 Class.forName("oracle.jdbc.driver.OracleDriver");

获得数据库连接:

1 DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/fireway", "root", "root");

创建Statement/PreparedStatement对象:

1 conn.createStatement();
2 conn.prepareStatement(sql);

下面我们看看上面的语句分别做了什么事情:

  1. Connection就是JDBC的服务接口;
  2. Class.forName("...")会实例化一个com.mysql.jdbc.Driver类(服务提供者接口的实现类),并将这个类的实例注册到DriverManager.registerDriver(提供者注册API);
  3. 通过建立连接的URL,用户名,密码来获取链接到mysql数据库的Connection服务。DriverManager.getConnection()是服务访问API, 返回的是具体的实现类对象。
  4. Driver就是服务提供者接口。

参考资料:

我的码云主页:https://gitee.com/firewaycoding/events

service provider frameworks - 服务提供者框架: 多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来。

SPF 包括以下组件:

组件说明
服务接口(Service Interface )这是提供者实现的
提供者注册API(Provider Registration API)这是系统用来注册实现,让客户端访问
服务访问API(Service Access API)是客户端用来获取服务的实例的

服务访问API一般允许但是不要求客户端指定某种选择提供者的条件,如果没有这样的规定,API就会返回默认实现的一个实例

服务访问API是“灵活的静态工厂”,它构成了SPF的基础

服务提供者接口(Service Provider Interface)负责创建其服务实现的实例

示例: SPFTest

通过上面的例子可以看出,我们只需要输入一个key就可以得到对应的类的实例,进而使用该类的方法,这种方法能大大降低代码的耦合度,这里的Map集合可以理解为服务提供者框架的注册机制,Map中的Key和Value的值都应该在配置的属性文件(properties)中,这样方便我们查看和添加服务类,我们只需要操作这个配置文件就可以了,这样我们的实际模式实现了java的解耦合问题。

服务接口的具体实现类和服务提供者接口的实现类都是服务提供者自己去实现。以JDBC为例,这2个模块由具体的数据库提供商来实现。

示例:JDBC(Java数据库连接,Java Database Connectivity)

加载驱动程序:

1 Class.forName(driverClass);
2 //加载MySql驱动
3 Class.forName("com.mysql.jdbc.Driver");
4 //加载Oracle驱动
5 Class.forName("oracle.jdbc.driver.OracleDriver");

获得数据库连接:

1 DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/fireway", "root", "root");

创建Statement/PreparedStatement对象:

1 conn.createStatement();
2 conn.prepareStatement(sql);

下面我们看看上面的语句分别做了什么事情:

  1. Connection就是JDBC的服务接口;
  2. Class.forName("...")会实例化一个com.mysql.jdbc.Driver类(服务提供者接口的实现类),并将这个类的实例注册到DriverManager.registerDriver(提供者注册API);
  3. 通过建立连接的URL,用户名,密码来获取链接到mysql数据库的Connection服务。DriverManager.getConnection()是服务访问API, 返回的是具体的实现类对象。
  4. Driver就是服务提供者接口。

参考资料: