zoukankan      html  css  js  c++  java
  • 【Effective Java】1、静态工厂的方式代替构造函数

    使用一个服提供者对进行服务的提供,服务的请求通过不同的提供者提供不同的服务,服务提供者首先必须在工厂中进行注册,然后才可以通过工厂实例化服务

    Service.java

    package cn.xf.cp.ch02;
    
    /**
     * 
     *功能:这是一个服务类
     *时间:下午6:03:23
     *文件:Service.java 
     *@author Administrator
     *
     */
    public interface Service
    {
        //比如服务类提供一个hello world的服务
        public void sayHello();
    }
    Provider.java
    package cn.xf.cp.ch02;
    
    /**
     * 
     *功能:服务的提供者
     *时间:下午6:05:29
     *文件:Provider.java 
     *@author Administrator
     *
     */
    public interface Provider
    {
        public Service newInstance();
    }

    ServicesFactory.java 

    package cn.xf.cp.ch02;
    
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     * 
     *功能:服务工厂,提供服务的实体类
     *    这是是进行服务的注册和连接。只有先注册了的服务才可以进行连接9
     *时间:下午6:06:32
     *文件:ServicesFactory.java 
     *@author Administrator
     *
     */
    public class ServicesFactory
    {
        //构造函数私有化,避免别的调用者不通过静态工厂方法实例
        private ServicesFactory(){};
        
        //服务注册的时候保存在容器中,并如果没有指定的实例方式,那么还得设定一个默认的实例方式
        private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
        
        private static final String DEFAULT_PROVIDER_NAME = "<def>";
        
        //进行注册方法的API,注册一个提供服务的人
        public static void registerDfaultProvider(Provider p)
        {
            resgisterProvider(DEFAULT_PROVIDER_NAME, p);
        }
        
        public static void resgisterProvider(String name, Provider p)
        {
            providers.put(name, p);
        }
        
        //进行连接方法的API,和注册的方法类型
        public static Service newInstance()
        {
            return newInstance(DEFAULT_PROVIDER_NAME);
        }
        
        //根据提供者的名字提供相应的服务
        public static Service newInstance(String name)
        {
            Provider p = providers.get(name);
            if(p == null)
            {
                //如果没有注册的话,就抛出异常
                throw new IllegalArgumentException("这个提供服务的对象没有进行注册" + name);
            }
            
            return p.newInstance();
        }
    }

    测试代码

    package cn.xf.cp.ch02;
    
    public class Test
    {
        public static void main(String[] args)
        {
            // 首先注册服务请求人
            ServicesFactory.registerDfaultProvider(DEFAULT_PROVIDER);
            ServicesFactory.resgisterProvider("comp", COMP_PROVIDER);
            ServicesFactory.resgisterProvider("armed", ARMED_PROVIDER);
    
            // 实例化服务
            Service s1 = ServicesFactory.newInstance(); // 默认的
            Service s2 = ServicesFactory.newInstance("comp");
            Service s3 = ServicesFactory.newInstance("armed");
            
            s1.sayHello();
            s2.sayHello();
            s3.sayHello();
        }
    
        private static Provider    DEFAULT_PROVIDER    = new Provider()
                                                    {
                                                        public Service newInstance()
                                                        {
                                                            return new Service()
                                                                                                        {
                                                                                                            @Override
                                                                                                            public String toString()
                                                                                                            {
                                                                                                                return "Default service";
                                                                                                            }
    
                                                                                                            @Override
                                                                                                            public void sayHello()
                                                                                                            {
                                                                                                                System.out
                                                                                                                        .println(
                                                                                                                                "DEFAULT_PROVIDER这个排版很有问题啊");
    
                                                                                                            }
                                                                                                        };
                                                        }
    
                                                    };
    
        private static Provider    COMP_PROVIDER        = new Provider()
                                                    {
                                                        public Service newInstance()
                                                        {
                                                            return new Service()
                                                                                                        {
                                                                                                            @Override
                                                                                                            public String toString()
                                                                                                            {
                                                                                                                return "Complementary service";
                                                                                                            }
    
                                                                                                            @Override
                                                                                                            public void sayHello()
                                                                                                            {
                                                                                                                System.out
                                                                                                                        .println(
                                                                                                                                "COMP_PROVIDER这个排版很有问题啊");
    
                                                                                                            }
                                                                                                        };
                                                        }
                                                    };
    
        private static Provider    ARMED_PROVIDER        = new Provider()
                                                    {
                                                        public Service newInstance()
                                                        {
                                                            return new Service()
                                                                                                        {
                                                                                                            @Override
                                                                                                            public String toString()
                                                                                                            {
                                                                                                                return "Armed service";
                                                                                                            }
    
                                                                                                            @Override
                                                                                                            public void sayHello()
                                                                                                            {
                                                                                                                System.out
                                                                                                                        .println(
                                                                                                                                "ARMED_PROVIDER这个排版很有问题啊");
    
                                                                                                            }
                                                                                                        };
                                                        }
                                                    };
    }

    结果显示:

  • 相关阅读:
    threadlocal 变量 跟synchronized 关键字的关系
    Android媒体扫描详细解析之一(MediaScanner & MediaProvider)
    创建视图全文搜索[完整版]
    海量小文件问题综述
    内存拷贝探究
    case功能菜单选项
    linux case ${variable} in
    attack source code
    ftps加密服务器
    vim编程设置
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5840043.html
Copyright © 2011-2022 走看看