에릭 프리먼의 헤드 퍼스트 디자인 패턴을 읽고 정리한 후,
Swift로 적용해보는 스터디입니다.
안녕하세요 toma입니다!
이번에 정리할 디자인 패턴은 팩토리를 이용한 팩토리 메소드 패턴과 추상 팩토리 패턴입니다!
자료 만드는 재미가 쏠쏠하네요 🙃
어떤 객체를 생성할 때 직접 객체의 인스턴스를 생성하는 것이 아니라,
팩토리 객체에게 그 작업을 맡겨 의존성을 주입받는 방법
즉, 객체 생성을 처리하는 팩토리를 통해 구상 클래스의 인스턴스를 만드는 행동을 캡슐화
합니다.
쉽게 말해 팩토리 패턴은 객체를 찍어내는 공장을 이용하는 방법입니다!
팩토리 패턴 자체를 디자인 패턴으로 볼 수는 없고, 팩토리 객체를 사용해 코드를 정리하는 하나의 방법입니다.
팩토리 메소드 패턴
과 추상 팩토리 패턴
이 팩토리를 사용해 정의된 디자인 패턴입니다.
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데
어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듦.
팩토리 메소드 패턴에서 중요한 것은 클래스의 인스턴스를 만드는 일을 서브클래스가 한다는 점입니다.
제품에 따라서 공장의 생산라인을 바꾸는 것이 아니라 기본이 되는 생산라인은 설치해놓고 요청이 들어오면 요청에 맞는 제품을 생산해주는 패턴이라고 생각하면 됩니다.
여기서 포인트는 공장은 어떠한 요청이 들어올지 모른다는 점입니다.
그저 요청에 맞는 제품만 찍어내면 된다는 것이지요.
팩토리 메소드 패턴을 간단히 정리하면 Creator
, Concrete Creator
, Product
, Concrete Creator
로 이루어져 있습니다.
Creator
- Factory의 기본 역할을 정의하는 객체
Concrete Creator
- Creator를 채택하고 있으며 product에 맞는 구체적 기능을 구현
Product
: Concrete Product가 해야할 동작들을 선언하는 객체
Concrete Product
: Product를 채택하며 그에 맞게 만든 실제 객체
쉽게 이해해보기 위해 팩토리 메소드 패턴을 이용해 아이폰을 만드는 iPhoneFactory
를 세워보겠습니다!
Creator
는 아이폰을 생산하는 iPhoneFactory
입니다.
Product
는 제품인 iPhone
입니다.
iPhoneFactory
를 구현하는 iPhone14Factory
, iPhone13Factory
, iPhone12Factory
가 있고,
Product
를 구현하는 iPhone14
, iPhone13
, iPhone12
가 있습니다.
인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
추상 팩토리 패턴을 사용하면 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있습니다.
팩토리 메소드 패턴과 다른 점은 무엇일까요?
추상 팩토리 패턴은 기존에 팩토리를 한번 더 추상화 하여 서로 관련이 있는 제품군을 생성 하게 해줍니다.
🤔 팩토리를 한번 더 추상화?
1. 기존에 Button을 만들어주는 Factory, Label을 만들어주는 Factory가 있다고 가정
2. 저희는 iPad, iPhone 전용 UI가 필요합니다. 즉 각각 기기에 맞는 Button, Label이 필요합니다.
3. 이때 Button, Label Factory를 한번 더 추상화하여 iPad, iPhone Factory를 만든다면 각각 부품에 대한 Factory를 가지는 것이 아니라 iPad, iPhone Factory를 가지면 한번에 해결이 됩니다.
팩토리 메소드 패턴을 간단히 정리하면 AbstractFactory
, ConcreteFactory Creator
, AbstractProduct
, ConcreteProduct Creator
로 이루어져 있습니다.
AbstractFactory
-실제 팩토리 클래스의 공통 인터페이스
ConcreteFactory
- 구체적인 팩토리 클래스로 AbstractFactory 클래스의 추상 메서드를 오버라이드함으로써 구체적인 제품을 생성한다.
AbstractProduct
- 제품의 공통 인터페이스
ConcreteProduct
- 구체적인 팩토리 클래스에서 생성되는 구체적인 제품
아까 추상 메소드 패턴 때 만든 iPhoneFactory
이 대박이 나서 이젠 아이패드도 생산하게 되었고, 인도와 중국에 각각 AppleFactory
를 세우게 되었습니다.
🔎 언제 Factory Method 대신 Abstract Factory Method 패턴을 사용할까?
- 제품군중 하나를 선택하여 시스템을 설정해야 하고 구성한 제품군을 다른 것으로 대체 할 수 있을 때
- 연관되어 있는 다수의 인스턴스가 함께 사용하도록 설계하고, 이 부분에 대한 제약이 외부에서도 지켜지도록 하고 싶을 때