구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공한다. 구상 클래스는 서브클래스에서 만든다.
추상 팩토리로 제품군을 생성하는 인터페이스를 제공할 수 있다.
이 인터페이스를 사용하면 코드와 제품을 생산하는 팩토리를 분리할 수 있다.
코드가 실제 제품과 분리되어 있으므로 다른 결과가 필요하면 다른 팩토리를 사용하면 된다.
객체를 생성할 때 필요한 인터페이스를 만든다.
어떠한 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다.
팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에게 맡기게 된다.
모든 팩토리 패턴은 객체 생성을 캡슐화한다.
팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화한다.
의존성 뒤집기 원칙(Dependency Inversion Principle)
추상화된 것에 의존하게 만들고 구상 클래스에 의존하지 않게 만든다.
✅ 변수에 구상 클래스의 레퍼런스를 저장하지 말자.
✅ 구상 클래스에서 유도된 클래스를 만들지 말자.
✅ 베이스 클래스에 이미 구현되어 이쓴ㄴ 메소드를 오버라이드하지 말자.
애플리케이션을 특정 구현으로부터 분리하는 일을 한다.
객체 생성관 관련된 복잡성을 숨기고, 생성과 사용을 분리하여 유지 보수성을 향상시켜주며 유연성과 확장성을 높여준다.
캡슐화와 다형성을 활용하여 결합도를 낮추고, 객체 생성을 추상화하여 객체 생성에 대한 변경이 발생해도 클라이언트 코드에 영향을 미치지 않도록 한다.
| 구분 | 팩토리 메소드 패턴 | 추상 팩토리 패턴 |
|---|---|---|
| 객체 생성 방식 | 하나의 객체를 생성하는 팩토리 메소드를 생성 | 여러 개의 관련 객체를 생성하는 팩토리를 생성 |
| 객체 생성 결정 방식 | 객체 생성을 서브 클래스에서 결정 | 객체 생성을 다른 클래스에 위임 |
| 객체 생성 대상 | 하나의 객체 | 관련된 객체 패밀리 |
| 인터페이스 사용 여부 | ❌ | ⭕ |
| 관련 클래스의 계층 구조 | ⭕ | ❌ |
| 컴파일 시간에 객체 생성 결정 | 객체 생성 시점에서 구체적인 유형을 모를 수 있음 | 객체 생성 시점에서 구체적인 유형을 알고 있어야 함 |
HeadFirst DesignPattern - 한빛미디어