首页 > 代码库 > 【Effective Java】1、静态工厂的方式代替构造函数

【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这个排版很有问题啊");                                                                                                        }                                                                                                    };                                                    }                                                };}

 

结果显示:

技术分享

 

【Effective Java】1、静态工厂的方式代替构造函数