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 <T> List<T> emptyList() { return EMPTY_LIST;}
?
4.使用静态方法可以减少泛型编程代码的冗长度
//创建HashMap的代码过于冗长Map<String, List<String>> m =new HashMap<String, List<String>>();public static <K, V> HashMap<K, V> newInstance() {return new HashMap<K, V>();}//使用newInstance()更简洁Map<String, List<String>> 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){}}
?
?
?
?
?
?
?