• 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();
        }
    }
  • 相关阅读:
    jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation"
    layer实现关闭弹出层刷新父界面功能详解
    PHP开发APP接口简单签名全过程(二)实际测试
    PHP开发APP接口简单签名全过程(一)
    Laravel 避免 Trying to get property of non-object 错误的六种方法 [新增第六种 data_get]
    在PHP代码中将HTML代码原样输出的方式
    在使用 Laravel Eloquent 模型时,我们要判断取出的结果集是否为空,但我们发现直接使用 is_null 或 empty是无法判段它结果集是否为空的!!!
    使用layer的iframe层提交表单后,需要关闭当前的iframe层,然后刷新父页面的方法
    laravel中如何实现验证码验证及使用
    递归思想的由来
  • 原文地址:https://www.cnblogs.com/sallet/p/4428685.html
Copyright © 2020-2023  润新知