zoukankan      html  css  js  c++  java
  • 条目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();
    }
    
  • 相关阅读:
    [转]SQL Server中的执行引擎入门
    [转]C# 导入导出Excel通用类(SamWang)
    【转】TSQL查询进阶—理解SQL Server中的锁
    [转载]使用分页方式读取超大文件的性能试验
    【总结】读《WEB三层架构的束缚》后的感想
    【转】jQuery使用 $.post提交json数据
    【原创】关于索引的总结
    【转】.net 匿名函数的变化
    【转】List<T>的Sort,Find,Exists等的使用
    【转】Http中Get/Post请求区别
  • 原文地址:https://www.cnblogs.com/tisakong/p/4475996.html
Copyright © 2011-2022 走看看