服务提供者框架模式
service provider frameworks - 服务提供者框架: 多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来。
从字面上理解,就是提供服务的一个框架,它不对外暴露是怎么实现服务的,我需要什么服务就使用什么服务,当然我使用的这个服务类必须是已经在这个服务框架存在的,提供者为框架的用户提供了多个API实现,所以这个服务提供者框架必须提供一种机制来注册这些实现类,以便我们能够使用它们,我们只需要使用框架来调用自己想用的服务就可以了,无需关心自己到底在使用哪个实现以及服务是怎么实现的。
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)
加载驱动程序:
Class.forName(driverClass) //加载MySql驱动 Class.forName("com.mysql.jdbc.Driver") //加载Oracle驱动 Class.forName("oracle.jdbc.driver.OracleDriver")
获得数据库连接:
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/fireway", "root", "root")
创建Statement\PreparedStatement对象:
conn.createStatement(); conn.prepareStatement(sql);
下面我们看看上面的语句分别做了什么事情:
- Connection就是JDBC的服务接口;
Class.forName("...")
会实例化一个com.mysql.jdbc.Driver类(服务提供者接口的实现类),并将这个类的实例注册到DriverManager.registerDriver(提供者注册API);- 通过建立连接的URL,用户名,密码来获取链接到mysql数据库的Connection服务。DriverManager.getConnection()是服务访问API, 返回的是具体的实现类对象。
- Driver就是服务提供者接口。
参考资料:
时间: 2024-10-25 23:53:19