使用工厂模式,你无需向使用者暴露实例化的逻辑就能完成对象的创建。
非Lambda实现:
例子:银行工作,他们需要一种方式创建不同的金融产品:贷款、期权、股票
public class ProductFactory {
public static Product createProduct(String name){
switch(name){
case "loan": return new Loan();
case "stock": return new Stock();
case "bond": return new Bond();
default: throw new RuntimeException("No such product " + name);
}
}
}
这里贷款(Loan)、股票(Stock)和债券(Bond)都是产品(Product)的子类。在创建对象时不用再担心会将构造函数或者配置暴露给客户,这使得客户创建产品时更加简单:
Product p = ProductFactory.createProduct("loan");
Lambda实现:
lambda可以实现像引用方法一样引用构造函数
Supplier<Product> loanSupplier = Loan::new;
Loan loan = loanSupplier.get();
public class ProductFactory {
final static Map<String, Supplier<Product>> map = new HashMap<>();
static {
map.put("loan", Loan::new);
map.put("stock", Stock::new);
map.put("bond", Bond::new);
}
public static Product createProduct(String name){
Supplier<Product> p = map.get(name);
if(p != null) return p.get();
throw new IllegalArgumentException("No such product " + name);
}
}