静态工厂方法与构造器不同之处在于
1.它们有名称
2.不必在每次调用时,创建新对象
3.多态性,可以返回原类型,或者其子类型
代码说明
// 服务接口 public interface Service { // 特定方法 } // 服务提供者 public interface Provider { Service newService(); } // 注册服务 public class Services { private Services() { } // 构造器私有,不被实例化 // 名称-服务的Map private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; // 注册api public static void registerDefaultProvider(Provider p) { registerProvider(DEFAULT_PROVIDER_NAME, p); } public static void registerProvider(String name, Provider p) { providers.put(name, p); } // 获取服务 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.newService(); } }
4.创建参数化实例,静态工厂方法代码更简洁
静态工厂方法的缺点
1.如果没有提供public或者protected构造器,不能被实例化
2.与其他静态方法没有区别
结语
视情况或者应用环境而运用。
PS:这是Effective Java 的学习记录系列