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

                                                                                                        }
                                                                                                    };
                                                    }
                                                };
}

结果显示:

原文地址:https://www.cnblogs.com/cutter-point/p/5840043.html