Effective Java1静态工厂的方式代替构造函数
Posted cutter_point
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Java1静态工厂的方式代替构造函数相关的知识,希望对你有一定的参考价值。
使用一个服提供者对进行服务的提供,服务的请求通过不同的提供者提供不同的服务,服务提供者首先必须在工厂中进行注册,然后才可以通过工厂实例化服务
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 Java1静态工厂的方式代替构造函数的主要内容,如果未能解决你的问题,请参考以下文章
Effective Java大厂实战之考虑以静态工厂方法代替构造方法
Effective Java大厂实战之考虑以静态工厂方法代替构造方法
Effective Java大厂实战之考虑以静态工厂方法代替构造方法
读书笔记 - Effective Java01. 考虑用静态工厂方法代替构造器