使用Lambdas重构工厂设计模式

19-01-28 banq
                   

工厂设计模式让我们创建对象而不将实例化逻辑暴露给客户端。例如,假设您正在为银行工作,他们需要一种创建不同金融产品的方式:贷款,债券,股票等。让我们绘制一个类图并编写一些代码来理解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);
}