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();
        }
    }
  • 相关阅读:
    21天打造分布式爬虫-房天下全国658城市房源(十一)
    21天打造分布式爬虫-简书整站爬取(十)
    21天打造分布式爬虫-下载汽车之家图片(九)
    21天打造分布式爬虫-Crawl类爬取小程序社区(八)
    21天打造分布式爬虫-Spider类爬取糗事百科(七)
    21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)
    21天打造分布式爬虫-多线程下载表情包(五)
    21天打造分布式爬虫-中国天气网和古诗文网实战(四)
    21天打造分布式爬虫-豆瓣电影和电影天堂实战(三)
    3.使用Selenium模拟浏览器抓取淘宝商品美食信息
  • 原文地址:https://www.cnblogs.com/sallet/p/4428685.html
Copyright © 2011-2022 走看看