使用Lambdas重構工廠設計模式

banq發表於2019-01-28

工廠設計模式讓我們建立物件而不將例項化邏輯暴露給客戶端。例如,假設您正在為銀行工作,他們需要一種建立不同金融產品的方式:貸款,債券,股票等。讓我們繪製一個類圖並編寫一些程式碼來理解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);
}


 

相關文章