• 条目1:考虑使用静态工厂方法代替构造方法


    使用静态工厂方法代替构造方法

    使用静态工厂方法的几大好处:

    1.可以为它们取名可以让客户端更加方便使用。
    Integer.probablePrime();
    Integer.natural();
    可以分别用来表示获取可能的质数和自然数,清晰易读。
    

    2.不用在每次在每次调用它时创建一个新的对象。
        a.预先构建好实例;
        b.将构建好的实例存储起来,进行重复利用。
    

    3.它可以返回原类型的任何子类型的对象。
    

    4.在创建参数化类型的实例时,它们使代码变得更加简洁。
    

    使用静态工厂方法的主要缺点

    1.类如果不含有共有的或者受保护的构造方法,它就不能被子类化。
    

    2.它与其他静态方法实质上没有任何区别。
    不过静态方法有一些惯用的取名:
        valueOf
        of
        getInstance
        newInstance
        getType
        newType
    

    实例

    客户端:
    
    public class Test {
        private static final Provider DEFALUT_PORVIDER = new Provider() {
    
            @Override
            public Service newService() {
                return new Service() {
                    public String toString() {
                        return "get DEFAULT service!";
                    };
                };
            }
        };
        private static final Provider CUSTOME_PROVIDER = new Provider() {
    
            @Override
            public Service newService() {
                return new Service() {
                    public String toString() {
                        return "get CUSTOME service";
                    };
                };
            }
        };
    
        public static void main(String[] args) {
            /****************************默认服务*********/
            //注册服务
            Services.registerDefaultProvider(DEFALUT_PORVIDER);
            //从提供者那里拿到服务
            Service service = Services.newInstance();
            System.out.println(service);
    
    
            /************自定义服务***********/
            Services.registerProvider("CUSTOME_PROVIDER", CUSTOME_PROVIDER);
            Service service2 = Services.newInstance("CUSTOME_PROVIDER");
            System.out.println(service2);
    
    
        }
    }
    

        /**
     * 注册服务提供者
     * @author TisaKong
     * 2015-5-4
     */
    public class Services {
    
        private static final String DEFAULT_PROVIDER = "<DEF>";
    
        private static final Map<String , Provider> providers = new ConcurrentHashMap<String, Provider>();
    
        public static void registerProvider(String name , Provider p){
            providers.put(name, p);
        }
    
        public static void registerDefaultProvider(Provider p){
            registerProvider(DEFAULT_PROVIDER, p);
        }
    
        public static Service newInstance(){
            return newInstance(DEFAULT_PROVIDER);
        }
        public static Service newInstance(String name){
            Provider p = providers.get(name);
            if(p == null){
                throw new IllegalArgumentException("No provider registered with name:"+name);
            }
            return p.newService();
        }
    }
    

    /**
     * 服务接口
     * @author TisaKong
     * 2015-5-4
     */
    public interface Service {
        // Service-specific methods go here
    }
    

    /**
     * 服务提供商接口
     * @author TisaKong
     * 2015-5-4
     */
    public interface Provider {
        public Service newService();
    }
    
  • 相关阅读:
    GCD介绍(二): 多核心的性能
    GCD介绍(一): 基本概念和Dispatch Queue
    iOS 中如何监测某段代码运行的时间
    DSOframer 无法正常加载的解决方案
    Hexo 官方主题 landscape-plus 优化
    在 Parallels Desktop 中,全屏模式使用 Win7,唤醒时黑屏
    VS2015 企业版不支持 JavaScript 语法高亮、智能提醒
    解决 Boot Camp 虚拟机升级到 Windows 10 后 Parallels Desktop 不能识别的问题
    利用SkyDrive Pro 迅速批量下载SharePoint Server 上已上传的文件
    SharePoint Server 2013 让上传文件更精彩
  • 原文地址:https://www.cnblogs.com/tisakong/p/4475996.html
Copyright © 2020-2023  润新知