Intent
- 클라이언트에게 생성 로직을 노출하지 않으면서 객체를 생성하기
- 객체를 생성할 수 있는 Common Interface 제공
Implementation

Applicablity
클라이언트 - 제품을 쓰고싶음, 근데 직접 new 연산자를 호출하기는 싫음
팩토리 - 클라이언트에게 요청을 받아 제품을 찍어줌
제품 - 제품
Specific problems & Implementation
리플렉션을 통해 공장이 제품을 찍어내는 메소드의 파라미터로 클래스 정보를 전달하게 하면 새로운 구체 제품 구체 클래스를 구현하여도 생성을 위해 Factory 메서드의 코드를 전혀 수정 하지 않아도 됨
리플렉션을 안쓰면 아래의 예시와 같이 hashmap을 일종의 타입토큰 처럼 활용할 수 있음 (차라리 타입토큰을 쓰자)
abstract class Product { public abstract Product createProduct(); ... } class OneProduct extends Product { ... static { ProductFactory.instance().registerProduct("ID1", new OneProduct()); } public OneProduct createProduct() { return new OneProduct(); } ... } class ProductFactory { public void registerProduct(String productID, Product p) { m_RegisteredProducts.put(productID, p); } public Product createProduct(String productID){ ((Product)m_RegisteredProducts.get(productID)).createProduct(); }
제일 베스트 - 팩토리 메서드 패턴