我正在阅读有效的Java和Joshua Bloch这本书,在第二章中说:
静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。
我不知道如何在实践中使用这个概念?
有人可以举一个例子。
答案 0 :(得分:4)
1。从客户端隐藏(更好地封装)对象创建
这是所谓的“简单工厂”(又称参数化工厂)的示例:
public class UserFactory {
public static User newUser(UserEnum type){
switch (type){
case ADMIN: return new Admin();
case STAFF: return new StaffMember();
case CLIENT: return new Client();
default:
throw new IllegalArgumentException("Unsupported user. You input: " + type);
}
}
}
将对象创建封装到静态工厂中的目的在于,用户不知道(也不在乎)如何创建对象:
// client code - give me an admin object,
// don't care about the inner details of how it gets constructed
User admin = UserFactory.newUser(ADMIN);
2。灵活地交换实施方案而不会破坏客户端代码
考虑此静态工厂方法:
// swap out with LinkedList later if you like,
// it won't break the 100 places that invoke this method
public static List<String> getMyList(){
return new ArrayList<>();
}
不喜欢任何标准列表实现,而是在一段时间后创建自己的列表吗?
public class MyMuchBetterList<E> extends AbstractList<E> implements List<E> {
// implementation
}
没问题,您仍然可以在静态工厂内交换,而不会影响那些使用getMyList的人:
public static List<String> getMyList(){
return new MyMuchBetterList<>(); // compiles and works, subtype of list
}
答案 1 :(得分:1)
例如,考虑要编写自己的选项类型。您可能有一个带有两个实现类MyOption
和Present
的接口Absent
。然后,您可能希望使用静态工厂方法将可能为空的值转换为MyOption
对象。可能看起来像这样:
public static <T> MyOption<T> ofNullable(T value) {
if(value == null) {
return new Absent<>();
} else {
return new Present<>(value);
}
}
请注意,静态工厂方法MyOption.ofNullable(value)
根据参数的值返回不同的对象类。编写new MyOption<>(value)
具有相同行为的构造函数是不可能的。