• 静态工厂方法之服务提供者框架


      静态工厂返回的对象所属的类,在编写包含该静态工厂方法的类的时候,可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架的基础,例如JDBC的API.服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现.并把它们从多个实现中解耦出来.

      服务提供者框架包含四大组件-服务接口(提供者实现),提供者注册API(由系统用来注册实现),服务访问API(客户端用来访问服务的实例),服务提供者接口(服务者负责创建其服务实现的实例).下面的例子就是服务提供者框架的具体实现:

      首先是服务接口和服务提供者接口,服务提供者用来产生服务:

    /**
     * 
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * 服务接口
     */
    public interface Service {
        //Service方法.
        public void doService();
    }
    /**
     * 
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     * 服务提供者接口
     */
    public interface Provider {
        public Service newService();
    }

      紧接着是服务提供者接口的实现和服务接口的实现:

    public class StrongProvider implements Provider{
    
        @Override
        public Service newService() {
            return new StrongService();
        }
        
    }
    public class WeekProvider implements Provider{
    
        @Override
        public Service newService() {
            return new WeekService();
        }
    
    }
    public class WeekService implements Service{
    
        @Override
        public void doService() {
            System.out.println("弱爆了");
        }
    
    }
    public class StrongService implements Service{
    
        @Override
        public void doService() {
            System.out.println("双击666");
        }
    
    }

      紧接着就是提供静态工厂了,我们通过静态工厂完成服务访问API,服务提供者注册API的编写:

    /**
     * 静态工厂,提供服务
     * @author 胡龙海
     * 创建时间: 2017年4月4日
     */
    public class Services {
        private Services(){}    //保证该类是不可实例化的
        private static Map<String,Provider> providers=new HashMap<>();//一系列服务提供者
        private static String DEFAULT_PROVIDER_NAME="<def>";
        /**
         * 提供者注册API.(默认)
         * @author 胡龙海
         * 创建时间: 2017年4月4日
         * @param provider
         */
        public static void registDefaultProvider(Provider provider) {
            providers.put(DEFAULT_PROVIDER_NAME, provider);
        }
        /**
         * 提供者注册API
         * @author 胡龙海
         * 创建时间: 2017年4月4日
         * @param providerName
         * @param provider
         */
        public static void registProvider(String providerName,Provider provider) {
            providers.put(providerName, provider);
        }
        /**
         * 服务访问API,默认
         * @author 胡龙海
         * 创建时间: 2017年4月4日
         * @return
         */
        public static Service newService() {
            return providers.get(DEFAULT_PROVIDER_NAME).newService();
        }
        /**
         * 服务访问API.
         * @author 胡龙海
         * 创建时间: 2017年4月4日
         * @param serviceName
         * @return
         */
        public static Service newService(String serviceName) {
            return providers.get(serviceName).newService();
        }
    }

      接着,我们就可以建立代码去测试了.可以去注册几个服务提供者,然后根据注册时的名字完成对于服务的调用.

    public class TestService {
        @Test
        public void testService() {
            Services.registProvider("week",new WeekProvider());
            Services.registProvider("strong", new StrongProvider());
            Services.registDefaultProvider(new StrongProvider());
            Services.newService().doService();
            Services.newService("week").doService();
        }
    }

      实际上,我们熟悉的JDBC编程就是基于这种服务提供者框架去实现的,其中Driver是服务提供者接口,Connection是服务接口,DriverManager.registDriver()是服务提供者注册API,而DriverManager.getConnection()是服务访问API.

  • 相关阅读:
    sublime 部分插件
    Error: EACCES: permission denied, mkdir '......node-sass/build'错误解决方案
    字符串
    数组
    MySQL5.7.26 忘记Root密码小计
    CentOS7安装MySQL8.0小计
    代替print输出的PY调试库:PySnooper
    聊聊数据库~5.SQL运维上篇
    'gbk' codec can't encode character 'xa0' in position 34: illegal multibyte sequence
    稍微记录下Django2.2使用MariaDB和MySQL遇到的坑
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6666254.html
Copyright © 2020-2023  润新知