zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    欣喜:终于找到了办法,可以把图片资源集成到dll文件之中了
    复习:关于类的继承和构造函数
    让Fckeditor支持中文——解决“Error loading "/fckeditor/fckstyles.xml" ”
    asp.net小技巧:保留password模式文本框textbox内的数据不丢失。
    数据库备份和恢复速记!
    资源:全球化与本地化(二)——指定语言语种
    一个Javascript类URI,顺便当作学习js类的笔记了。
    学习笔记:TimeSpan(时间片),以及各种时间差的算法
    ASP.NET MVC数据验证
    反射和属性
  • 原文地址:https://www.cnblogs.com/sallet/p/4428685.html
Copyright © 2011-2022 走看看