考虑用静态工厂方法代替构造器

  1. 方法有名字,可以知道构建的是什么样的一个对象;
  2. 不必在每次调用的时候都创建一个新的对象,可以使用预先缓存好的对象,避免创建重复的对象–这样做的好处就是可以提升性能;
  3. 可以有选择的返回子类型的对象。
  4. 在静态工厂方法中使用范型可以使代码简洁,如下:
public static <K,V> HashMap<K,V> newInstance(){
    return new HashMap<K,V>();
}
//using it,very simple
HashMap<String,List<String>> m = HashMap.newInstance(); 

服务提供者框架(service provider framework)

组成:

  1. 服务接口(service interface),提供者实现它,用来提供服务
  2. 提供者注册API(provider registration API)
  3. 服务访问者API(Service access API)
  4. 服务提供者接口(service provider Interface),这个是可选的,用来创建服务实现的实例,这块比较难懂,一会看代码。

以上的1,2,3看着像不像SOA?我感觉挺像的,其实SOA也好,RMI也好,都是一个思想。只不过是在运维过程中,需要加入不同的元素,使其可以更好的支撑业务。所以了解,J2EE中的基础结构,对于以后java工程中的各种模式,具有参考价值。

对于JDBC来讲:

  • Connection就是服务接口(service interface)
  • DriverManager.registerDriver是提供者注册API
  • DriverManager.getConnection是服务访问API
  • Driver就是服务提供者接口,负责创建connection实现的实例

    看下面的代码:

//Service provider framework sketch

//服务接口
public interface Service(){
 ...//这里是具体的服务提供方法
}

//服务提供者接口
public interface Provider{
    Service newService();
}

//不可实例化的类,用于服务注册和访问
public class Services {
    private Services{};//阻止实例化

    //映射服务名字到具体的服务
    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 void registerProvider(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("No provider registered with name:" + name);
        }
        return p.newService();//真正的调用服务的接口方法
    }
}       

通过以上的代码可以看出来,编写了接口的框架,不需要具体的实现类,可以完成程序主架构的代码编写,这样的代码逻辑结构清析。

以上代码的核心就是如何创建Service,以使用service中提供的服务方法。

你可能感兴趣的:(effective-java)