工厂设计模式让我们创建对象而不将实例化逻辑暴露给客户端。例如,假设您正在为银行工作,他们需要一种创建不同金融产品的方式:贷款,债券,股票等。让我们绘制一个类图并编写一些代码来理解Factory Design Pattern,然后使用lambda表达式来删除样板代码。
工厂设计模式:不使用Lambda表达式
通常我们使用一个负责创建不同对象的方法创建一个Factory类,如下所示:
public class FactoryMain {
public static void main(String[] args) {
Product p1 = ProductFactory.createProduct("loan");
}
}
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);
}
}
}
static private interface Product {}
static private class Loan implements Product {}
static private class Stock implements Product {}
static private class Bond implements Product {}
}
|
在这里,贷款,股票和债券都是产品的子类型。所述createProduct() 方法可以有额外的逻辑来配置每个创建的产品。但好处是您现在可以创建这些对象,而无需将构造函数和配置暴露给客户端,这使得客户端的产品创建更简单:
Product p = ProductFactory.createProduct("loan");
工厂设计模式:使用Lambda表达式
我们可以通过使用方法引用来引用构造函数,就像引用方法一样。例如,以下是如何引用Loan构造函数:
Supplier<Product> loanSupplier = Loan::new;
Loan loan = loanSupplier.get();
|
使用此技术,您可以通过创建将产品名称映射到其构造函数的Map来重写以前的代码:
private 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);
}
|
让我们使用这个Map来实例化不同的产品,就像你使用工厂设计模式一样:
public static Product createProductLambda(String name){
Supplier<Product> p = map.get(name);
if(p != null) return p.get();
throw new RuntimeException("No such product " + name);
}
|