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(); } }