package lambdasinaction.chap8; 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"); Supplier<Product> loanSupplier = Loan::new; Product p2 = loanSupplier.get(); Product p3 = ProductFactory.createProductLambda("loan"); } 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); } } static private interface Product {} 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); } }