首页 > 代码库 > 【Effective Java】1、静态工厂的方式代替构造函数
【Effective Java】1、静态工厂的方式代替构造函数
使用一个服提供者对进行服务的提供,服务的请求通过不同的提供者提供不同的服务,服务提供者首先必须在工厂中进行注册,然后才可以通过工厂实例化服务
Service.java
package cn.xf.cp.ch02;/** * *功能:这是一个服务类 *时间:下午6:03:23 *文件:Service.java *@author Administrator * */public interface Service{ //比如服务类提供一个hello world的服务 public void sayHello();}
Provider.java
package cn.xf.cp.ch02;/** * *功能:服务的提供者 *时间:下午6:05:29 *文件:Provider.java *@author Administrator * */public interface Provider{ public Service newInstance();}
ServicesFactory.java
package cn.xf.cp.ch02;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * *功能:服务工厂,提供服务的实体类 * 这是是进行服务的注册和连接。只有先注册了的服务才可以进行连接9 *时间:下午6:06:32 *文件:ServicesFactory.java *@author Administrator * */public class ServicesFactory{ //构造函数私有化,避免别的调用者不通过静态工厂方法实例 private ServicesFactory(){}; //服务注册的时候保存在容器中,并如果没有指定的实例方式,那么还得设定一个默认的实例方式 private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); private static final String DEFAULT_PROVIDER_NAME = "<def>"; //进行注册方法的API,注册一个提供服务的人 public static void registerDfaultProvider(Provider p) { resgisterProvider(DEFAULT_PROVIDER_NAME, p); } public static void resgisterProvider(String name, Provider p) { providers.put(name, p); } //进行连接方法的API,和注册的方法类型 public static Service newInstance() { return newInstance(DEFAULT_PROVIDER_NAME); } //根据提供者的名字提供相应的服务 public static Service newInstance(String name) { Provider p = providers.get(name); if(p == null) { //如果没有注册的话,就抛出异常 throw new IllegalArgumentException("这个提供服务的对象没有进行注册" + name); } return p.newInstance(); }}
测试代码
package cn.xf.cp.ch02;public class Test{ public static void main(String[] args) { // 首先注册服务请求人 ServicesFactory.registerDfaultProvider(DEFAULT_PROVIDER); ServicesFactory.resgisterProvider("comp", COMP_PROVIDER); ServicesFactory.resgisterProvider("armed", ARMED_PROVIDER); // 实例化服务 Service s1 = ServicesFactory.newInstance(); // 默认的 Service s2 = ServicesFactory.newInstance("comp"); Service s3 = ServicesFactory.newInstance("armed"); s1.sayHello(); s2.sayHello(); s3.sayHello(); } private static Provider DEFAULT_PROVIDER = new Provider() { public Service newInstance() { return new Service() { @Override public String toString() { return "Default service"; } @Override public void sayHello() { System.out .println( "DEFAULT_PROVIDER这个排版很有问题啊"); } }; } }; private static Provider COMP_PROVIDER = new Provider() { public Service newInstance() { return new Service() { @Override public String toString() { return "Complementary service"; } @Override public void sayHello() { System.out .println( "COMP_PROVIDER这个排版很有问题啊"); } }; } }; private static Provider ARMED_PROVIDER = new Provider() { public Service newInstance() { return new Service() { @Override public String toString() { return "Armed service"; } @Override public void sayHello() { System.out .println( "ARMED_PROVIDER这个排版很有问题啊"); } }; } };}
结果显示:
【Effective Java】1、静态工厂的方式代替构造函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。