第一条:考虑用静态工厂方法代替构造器

首先看一下下面这个将boolean 转为Boolean对象的方法:

public static Boolean valueof(boolean b){

    return b ? Boolean.TRUE : Boolean.FALSE;

}

利用静态工厂方法提供了客户端而不是构造器;

静态工厂方法与构造器不同的优势:

1、静态工厂方法有自定义的名称,产生的客户端代码更容易阅读。

public class Services {
    public static Services newInstance(){
        return new Services();
    }
}

2、不需要再每次调用工厂方法都创建一个新的对象。

Boolean.valueof(boolean),就说明了这项技术,对实例对象进行重复利用,jdk源码显示:

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE= new Boolean(false);

public static Boolean valueof(boolean b){

    return (b ? TRUE : FALSE);

}

以上的TRUE和FALSE实例对象,构建好实例之后,就缓存起来,重复利用,避免了重复创建对象。

3、静态工厂方法可以返回原返回类型的任何子类型的对象

//Service interface

public interface Service {

}
//Service provider interface
public interface Provider {

    Service newService();
}

public class Services {

    private Services(){};

    private static final Map<String,Provider> providers=new ConcurrentHashMap<>();

    public static final String DEFAULT_PROVIDER_NAME="def";
    
    //provider registeration 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=providers.get(name);
        if(p==null){
            throw  new IllegalArgumentException("No provider registered with name:"+name);
        }

        return p.newService();
    }
}

上述就是服务提供在框架,有三个重要的组件:服务接口、提供者注册API,服务访问API.

4、在创建参数化类型实例的时候,他们使代码变得更加简洁,最主要的是将多参数化的构造器简化成了很少或者没有参数的方法。更加简洁,通过对静态工厂方法命名,使得更加直观。例如:

Map<String,List<Map<String,List<String>>>> map = new HashMap<String,List<Map<String,List<String>>>>()

随着类型参数越来越长,越来越复杂,这一冗长的说明也很痛苦,但是有了静态工厂方法,编译器就可以替你找到类型参数.   

public static <K,V> HaahMap<K,V> newInstance(){
    retutn new HashMap<String,List<Map<String,List<String>>>>();
} 
在简化成
Map<String,List<Map<String,List<String>>>> map = new HashMap<>();

之前,上述的静态工厂方法就是一种好的选择。

静态工厂方法的缺点:

1、类如果不包含公有的或者受保护的构造器,就不能被子类化

2、他们与其他的静态方法实际没有任何区别。

静态工厂方法的惯用名称:

valueof 、  of   、getInstance、  newInstance、  getType 、 newType

切记第一反应就提供公有构造器,而不先考虑静态工厂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值