EFFECTIVE JAVA 第一天 静态工厂方法

静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器。提供静态工厂方法而不是公有构造器,这样做有几大优势。
在类的实现中使用了API的类被称为该API的客户(client)
使用API编写程序的程序员称为该API的用户(user)
术语:基本类型:primitive,引用类型:reference type
    方法的签名:由名称和所有参数类型组成,不包括返回类型
优点:
1、 有名称(当一个类有多个相同签名的构造器,用静态工厂代替更容易理解)
    2、不必在每次调用的时候都new一个(单例模式、枚举对象比较可以直接用 == 而不是equal(可以提升性能)。如果是经常请求创建相同的对象,这可以大大提上性能)
    3、可以返回原返回类型的任何子类对象。(适用于基于接口的框架interface-based-framework,API可以返回对象,同时又不会使对象的类变成公有的(这句话还不理解),如JAVA Collections Framework)
    静态工厂返回对象所属的类,在编写客户端类时可以不必存在(只是定义了就可以,典型应用:服务提供者框架:如JDBC,最后是类似的一个例子。服务访问API可以利用Adapter模式提供更丰富的服务)
    4、在创建参数化类型实例的时候,代码更加简洁。
缺点 :
    1、类如果不含有public或protected的构造器就不能被子类实例化(如:collections framework(这里需要看) ,这样的好处是鼓励使用符合composition,而不是继承)
    2、与其他静态方法没有任何区别
    以下是静态工厂的管用名称:
1)    valueOf
2)    of---valueOf的一种简洁替代,如EnumSet中
3)    getInstance
4)    newInstance
5)    getType---Type表示工厂方法所返回的对象类型
6)    newType




package 服务提供者框架模式;
/**
 * @描述: 服务接口
 */
public interface Service {

} 
/**
 * 服务提供者接口
 * 作用:负责创建服务实例(如果没有服务提供者接口,实现就按照类名称注册,并通过类反射进行实例化)
 * 对于JDBC,Connection是服务接口,DriverManager.registerDriver是提供者注册API
 * DriverManager.getConnection是服务访问API
 * Driver是服务提供者接口
 */
public interface Provider {
    //负责创建服务实例
    Service newService();
}
/**
 * @描述: 服务管理者
 */
public class ServiceManager {
    //prevents instantiation 防止实例化
    private ServiceManager() {}
    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    public static ConcurrentHashMap<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
    
    //provider registration API

    public static void resiterProvider(Provider p){
        resiterProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void resiterProvider(String name,Provider p){
        providers.put(name, p);
    }
    
    //service access API(服务访问API可以利用Adapter模式提供更丰富的服务
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }

    public static Service newInstance(String privoderName){
        Provider p = providers.get(privoderName);
        if(p == null)
            throw new IllegalArgumentException("没有注册的服务提供者!");
        return p.newService();
    }
}
原文地址:https://www.cnblogs.com/sallet/p/4428685.html