用静态工厂方法替代构造器 《Effective Java》读书笔记

25 篇文章 0 订阅

什么是静态工厂方法?

通过
1.className.getInstance();
2.className.newInstance();
3.className.valueOf();
等静态方法获得对象实例。
而一般我们会直接采用
new className(param1,param2)即构造器的方法来得到实例

静态工厂方法相比于构造器的优势

1.静态方法有名称

构造器并没有确切描述返回的对象,而适当名称的静态工厂方法可以有更佳的可读性。

2.静态工厂方法可以采用单例模式等限制对象数量

静态方法返回的对象可以是 new className(),也可以是已经有的对象。

3.静态工厂方法可以返回类型的任何子类型

样例代码
public interface Service{
\\some function
}
public interface Provider{
    Service newService();
}
public class Services{
    private Services(){};
    private static final Map<String,Provider> providers = new ConcurrentHashMap<String,Provider>();
    //provider register API
    public static void registerDefaultProvider(Provider p){
        registerProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void registerProvider(String name,Provider p){
        providers.put(name,p);
    }

    //Service access API
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name){
        Provider p = provider.get(name);
        if(p==null){
            throw new IllegalArgumentException(
                "No Provider registered with name:"+name);
        return p.newService();
    }

}

4.在创建参数化实例的时候,代码更简洁

代码:
Map<String,Integer> map = new HashMap<String,Integer>();
//对比
public static <K,V> HashMap<K,V> newInstance(){
    return new HashMap<K,V>();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值