package com.brianway.learning.java8.effective.tech; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; /** * 工厂模式 */ public class FactoryMain { public static void main(String[] args) { Product p1 = ProductFactory.createProduct("loan"); p1.printClassName(); // with lambdas Supplier<Product> loanSupplier = Loan::new; Product p2 = loanSupplier.get(); p2.printClassName(); Product p3 = ProductFactory.createProductLambda("loan"); p3.printClassName(); } static private 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); } } 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); } } private interface Product { default void printClassName() { System.out.println(getClass().getSimpleName()); } } static private class Loan implements Product { } static private class Stock implements Product { } static private class Bond implements Product { } final static private Map<String, Supplier<Product>> map = new HashMap<>(); static { map.put("loan", Loan::new); map.put("stock", Stock::new); map.put("bond", Bond::new); } }