2.1 使用静态工厂方法替代构造函数

使用静态工厂方法(static factory method)优点:

 

1.与构造函数相比,静态工厂方法具有更有意义的名称

public Boolean(String string) {}

//getBoolean()比new Boolean()名称上更有意义
public static boolean getBoolean(String string) {}

 

2.静态工厂方法可以返回一个已创建的对象,而构造函数每次都会创建一个新对象。利用此方式可实现flyweight设计模式。

//每次调用返回的是已存在的对象    
public static Boolean valueOf(boolean b) {
     return b ? Boolean.TRUE : Boolean.FALSE;
 }

 

3.静态工厂方法可以返回一个子类对象,或接口实现类(面向接口编程)。

//以下为java.util.Collections的方法
public static final  List emptyList() {
     return EMPTY_LIST;
}

 

4.使用静态方法可以减少泛型编程代码的冗长度

//创建HashMap的代码过于冗长
Map> m =new HashMap>();

public static  HashMap newInstance() {
return new HashMap();
}

//使用newInstance()更简洁
Map> m = HashMap.newInstance();

 

 

使用静态工厂方法的缺点:

 

1.如果被创建对象的类没有public/protected的构造函数,则不能被继承。但是可以使用composite设计模式进行封装,推荐后者

 

2.静态工厂方法可能与其他静态方法在名称上可能没有明显的区分,推荐使用以下名称作为静态工厂方法名称:

valueOf 用于数据类型转换Boolean.valueOf()
of 同上,如EnumSet.of()
getInstance 一般用于获取单列对象
newInstance 创建新对象,每次调用返回一个新对象
getType 获取Type指定的对象,此方法用于工具类,如Collections类
newType 创建Type指定的对象,此方法用于工具类

 

 

 使用静态工厂方法,可以实现服务注册框架(类似JDBC)

//服务接口
public interface Service{}

//服务提供器
public interface ServiceProvider{
    Service newService();
}

//服务管理者,用于注册服务提供器,获取服务
public class ServiceManager{
    public static void registerService(String name,ServiceProvider provider){}
    
    public static Service newService(String name){}
}

 

 

 

 

 

 

 

你可能感兴趣的:(Effective,Java)