静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在。这种灵活的静态工厂方法构成了服务提供者框架(Service Provider Framework)的基础,例如JDBC API。
服务提供者框架中有三个重要的组件:服务接口(Sevice Interface),这是提供者实现的;提供者注册API(provider Registration API),这是系统用来注册实现的;服务访问API,是客户端用来获取服务的实例。
JDBC源代码学习之服务提供者框架
http://edwinljg.iteye.com/blog/565742
package chapter2;
/*
* 服务接口。<BR>
*/
public interface Service {
public String read();
public void write(String content);
}
package chapter2;
/*
* 服务提供者接口。<BR>
*/
public interface Provider {
public Service getService();
}
package chapter2;
/*
* 服务提供者实现。<BR>
*/
public class AdobeProvider implements Provider {
static {
ServiceManager.registerProvider("Adobe", new AdobeProvider());
System.out.println("12313");
}
public Service getService() {
return new ServiceImpl();
}
class ServiceImpl implements Service {
public String read(){
System.out.println("Adobe read...");
return "";
}
public void write(String content) {
System.out.println("Adobe write...");
}
}
}
package chapter2;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 服务管理类。<BR>
*/
public class ServiceManager {
private ServiceManager() {
}
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static void registerProvider(String name, Provider p) {
providers.put(name, p);
}
public static Service getService(String name) {
Provider p = providers.get(name);
if(p == null) {
throw new IllegalArgumentException("No provider registered with name:" + name);
}
return p.getService();
}
}
package chapter2;
/**
* 测试用类。<BR>
*/
public class Test {
public static void main(String []args) throws Exception {
//註冊服务
Class.forName("chapter2.AdobeProvider");
//Class.forName("MicrosoftProvider");
//Class.forName("MacProvider");
//获得服务
Service service = ServiceManager.getService("Adobe");
//Service service = ServiceManager.getService("Microsoft");
//Service service = ServiceManager.getService("Mac");
service.read();
service.write("title");
}
}
对于JDBC来说,Connction就是它的服务访问接口,DriverManagers是提供者注册ApI,DriverManager.getConnetion是服务访问API.Driver就是服务提供者接口。
分享到:
相关推荐
程序修改生成的document.xml 和 item1.xml
Sales_item item1, item2; std::cin >> item1 >> item2; // first check that item1 and item2 represent the same book if (item1.same_isbn(item2)) { std::cout << item1 + item2 ; return 0; // indicate...
item实现item的动画效果,item实现item的动画效果item实现item的动画效果item实现item的动画效果item实现item的动画效果item实现item的动画效果item实现item的动画效果item实现item的动画效果item实现item的动画效果
listView item不同布局demo
1店铺查询(gy.erp.shop.get) 2仓库查询(gy.erp.warehouse.get) 3仓库新增(gy.erp.warehouse.add) 4商品品牌新增接口(gy.erp.item.brand.add) 5 商品品牌修改接口(gy.erp.item.brand.update) 6商品查询(gy...
Android RecyclerView 点击Item Item变大的效果Demo
LIS接口:接收仪器的请求(query);在LIS系统中检索该条码的测试项目(item);将测试的item转化为仪器的通道号(code)。这种通道号在不同的仪器中是不同定义的,所以LIS中一定会有一个相关仪器的通道与测试项目的...
matlab教程 - 了解与LeCroy X-Stream COM对象服务器接口的MATLAB语法从...Item和Item构造取决于所引用的属性。本文档提供了对界面的更高层次的理解,以便用户可以编写访问任何范围属性所需的代码,而无需“猜测”。
RecyclerView中item焦点问题,RecyclerView中item焦点问题,RecyclerView中item焦点问题
WiFi产品日本TELEC认证
ListView的Item上的按钮点击事件,接口回调
点击listview的某个item,在所点击的item的上部弹出popwindow, 手指弹起则消失,类似于qq消息的长按弹出的删除功能
android ListView Item点击展开子项效果
刷新单个item,模仿老虎的实时刷新item,刷新单个item,模仿老虎的实时刷新item
RecyclerView显示不同的item;
经常会遇到ExpandableListView这个控件,有的时候会有需求是当下拉列表子item被选中时要进行颜色的改变,以便标识
QTreeWidget类是一个方便的类,它提供了一个标准tree小部件与一个典型的基于项目所使用的接口类似QListView Qt 3类。这个类是基于Qt的模型/视图的体系结构,使用一个默认的模型项目,每一个都是一个QTreeWidgetItem。 ...
listview横向滑动删除item,完整demo
Effective C++ 3rd Item 9 Effective C++ 3rd Item 9 Effective C++ 3rd Item 9 Effective C++ 3rd Item 9 Effective C++ 3rd Item 9
谷歌的sdk中item的背景颜色默认是黄色的,通过自定义我们可以改变item的背景颜色