条目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();
}

 

posted @ 2015-05-04 13:35  克什米尔公子  阅读(124)  评论(0编辑  收藏  举报