用静态工厂方法代替构造函数

来源:互联网 发布:阿里巴巴比淘宝 编辑:程序博客网 时间:2024/05/21 08:41
package EffectiveJava;import java.util.HashMap;import java.util.Map;import static java.lang.System.out;interface Service{//里面可以提供操作服务的方法void say();}// 提供都接口,其提供一个返回服务的方法interface Provider{Service newService();// 返回服务的方法}class Services{private Services() {}// 提供一个注册服务、取得 服务的依法private static Map<String,Provider> providers = new HashMap<String,Provider>();public static final String DEFAULT = "DEFAULT";public static void registerProvider(String name,Provider provider){providers.put(name, provider);}public static Service newInstance(String name) {Provider p = providers.get(name);if(p == null)throw new IllegalArgumentException(name+" not register");return p.newService();}public static Service newInstance() { return providers.get(DEFAULT).newService();}}public class ProviderService  {private  static Provider CLOSE = new Provider() { // 定义一个provider,用于提供服务@Overridepublic Service newService() { // 重写provider 接口里的方法return new Service() { // 返回一个Service接口的匿名内public void say() {out.println("CLOSE Service alreay loading...");}};}};private static Provider JUMP = new Provider() {public Service newService() {return new Service() {public void say() {out.println("JUMP Service alreay loading...");}};}};public static void main(String argsp[]) {Services.registerProvider("close", CLOSE);Services.registerProvider("jump", JUMP);Services.newInstance("close").say();Services.newInstance("jump").say();}}/* * 服务提供者框架 * Service :服务接口 * Provider:提供者接口,用于提供服务,有一个得到服务的方法 * Services:提供服务类,给定String服务名,得到其相应的服务 * 因为是给定String 名,得到相应的服务对象,可以得到反射得到相应的类再实例化,也可以在 * Services 类中维护一个Map<String,Provider> 的映射表,在得到一个服务之前要注册,也就是map.put(String), * 放进注册中,在得到newInstance的时候,再map.get(String) 就行 * 从里面得到相应的Provider,再求得其 * 提供的服务对象 * */


用静态工厂方法代替构造函数的优点

 

1.不一定要创建对象

2.可以返回指定类型的对象,如果返回集合类时,我们可以返回一个Collection 接口的对象

 

下面是服务提供者框架: