헤드 퍼스트 디자인 패턴 - 4장 팩토리 패턴 in Swift

koi·2022년 10월 19일
0
post-thumbnail

에릭 프리먼의 헤드 퍼스트 디자인 패턴을 읽고 정리한 후,
Swift로 적용해보는 스터디입니다.

안녕하세요 toma입니다!

이번에 정리할 디자인 패턴은 팩토리를 이용한 팩토리 메소드 패턴추상 팩토리 패턴입니다!

자료 만드는 재미가 쏠쏠하네요 🙃


🏭 팩토리 패턴 (Simple Factory)

어떤 객체를 생성할 때 직접 객체의 인스턴스를 생성하는 것이 아니라,
팩토리 객체에게 그 작업을 맡겨 의존성을 주입받는 방법

즉, 객체 생성을 처리하는 팩토리를 통해 구상 클래스의 인스턴스를 만드는 행동을 캡슐화합니다.

쉽게 말해 팩토리 패턴은 객체를 찍어내는 공장을 이용하는 방법입니다!

팩토리 패턴 자체를 디자인 패턴으로 볼 수는 없고, 팩토리 객체를 사용해 코드를 정리하는 하나의 방법입니다.

팩토리 메소드 패턴추상 팩토리 패턴이 팩토리를 사용해 정의된 디자인 패턴입니다.


◽️ 팩토리 메소드 패턴

팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데
어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듦.

팩토리 메소드 패턴에서 중요한 것은 클래스의 인스턴스를 만드는 일을 서브클래스가 한다는 점입니다.

제품에 따라서 공장의 생산라인을 바꾸는 것이 아니라 기본이 되는 생산라인은 설치해놓고 요청이 들어오면 요청에 맞는 제품을 생산해주는 패턴이라고 생각하면 됩니다.

여기서 포인트는 공장은 어떠한 요청이 들어올지 모른다는 점입니다.
그저 요청에 맞는 제품만 찍어내면 된다는 것이지요.

팩토리 메소드 패턴을 간단히 정리하면 Creator, Concrete Creator, Product, Concrete Creator로 이루어져 있습니다.

  • Creator - Factory의 기본 역할을 정의하는 객체

  • Concrete Creator - Creator를 채택하고 있으며 product에 맞는 구체적 기능을 구현

  • Product : Concrete Product가 해야할 동작들을 선언하는 객체

  • Concrete Product : Product를 채택하며 그에 맞게 만든 실제 객체


팩토리 메소드 패턴 in Swift

쉽게 이해해보기 위해 팩토리 메소드 패턴을 이용해 아이폰을 만드는 iPhoneFactory 를 세워보겠습니다!

Creator는 아이폰을 생산하는 iPhoneFactory입니다.
Product는 제품인 iPhone입니다.

iPhoneFactory를 구현하는 iPhone14Factory, iPhone13Factory, iPhone12Factory가 있고,

Product를 구현하는 iPhone14, iPhone13, iPhone12가 있습니다.


장단점

  • 장점
    • 프로토콜로 기본 기능을 정의해주었기 때문에 기존 코드를 변경하지 않고 새로운 하위클래스를 추가가 가능하기 때문에 유연하고 확장성이 높다.
    • 코드에 수정 사항이 생기더라도 팩토리 메소드만 수정하면 되기 때문에 수정에 용이하다.
  • 단점
    • product가 추가될 때마다 새롭게 하위 클래스를 정의해주어야 하기 때문에 불필요하게 많은 클래스가 정의되어질 수 있고 그러다보면 복잡해지는 문제가 발생할 수 있다.
    • 중첩되어 사용되면 매우 복잡해질 우려가 있다.

◽️ 추상 팩토리 패턴

인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.

추상 팩토리 패턴을 사용하면 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있습니다.

팩토리 메소드 패턴과 다른 점은 무엇일까요?

추상 팩토리 패턴은 기존에 팩토리를 한번 더 추상화 하여 서로 관련이 있는 제품군을 생성 하게 해줍니다.

🤔 팩토리를 한번 더 추상화?
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 - 구체적인 팩토리 클래스에서 생성되는 구체적인 제품


추상 팩토리 패턴 in Swift

아까 추상 메소드 패턴 때 만든 iPhoneFactory이 대박이 나서 이젠 아이패드도 생산하게 되었고, 인도와 중국에 각각 AppleFactory를 세우게 되었습니다.

◽️ 팩토리 메소드 패턴 vs 추상 팩토리 패턴

🔎 언제 Factory Method 대신 Abstract Factory Method 패턴을 사용할까?

  • 제품군중 하나를 선택하여 시스템을 설정해야 하고 구성한 제품군을 다른 것으로 대체 할 수 있을 때
  • 연관되어 있는 다수의 인스턴스가 함께 사용하도록 설계하고, 이 부분에 대한 제약이 외부에서도 지켜지도록 하고 싶을 때
profile
Don't think, just do 🎸

0개의 댓글