다형적인 팩토리 메서드 패턴 2

컵의 종류도 다형적으로 구현해보자
- 한국에서는 일회용 컵 쓰고, 미국은 종이컵 쓰고…

Cup 클래스는 이제 추상 클래스로
- 생성자도 자식 클래스에서 호출하도록
protected생성자 - 자식 클래스
PaperCup,GlassCup의 생성자는 같은 패키지의AmericanMenu,KoreanMenu클래스에서 사용하도록 패키지 접근 제어자(default) 생성자
PaperCup 클래스는 멤버 변수로 뚜껑(Lid 클래스)을 가짐

이제 Cup 클래스는 직접 개체로 만들지 않을 예정
- 추상 클래스

AmericanMenu 클래스는 Lid 클래스와 의존성이 생김
- 내부에서
Lid개체 생성 - 의존성 주입(DI) 참고

장점 3가지
- 클라이언트는 생성할 개체를 몰라도 됨
- 생성 오류시
null반환 - 가상 생성자 패턴
- 다형성
가상 생성자(virtual constructor) 패턴
- 생성자는 오버라이딩이 불가능 → dynamic dispatch가 안 되므로 가상(virtual)이 될 수 없음
- 대신 부모 클래스에 개체 생성용 추상 메서드(
createCupOrNull())를 선언하고, 각 자식 클래스가 이를 오버라이딩해서 알맞은 구체 클래스(PaperCup,GlassCup)의 개체를 생성 - 호출하는 쪽은 부모 타입(
Menu추상 클래스)으로 호출 → 어떤 개체가 생성될지는 실행 중에 dynamic dispatch로 결정- 마치 생성자가 가상인 것처럼 동작
- 그래서 팩토리 메서드 패턴의 다른 이름이 가상 생성자 패턴
- 다형적인 팩토리 메서드 패턴 1 참고