Abstract Factory Pattern

박성민·2023년 5월 18일
0

디자인패턴

목록 보기
2/2

추상 팩토리 패턴이란?

  • 추상팩토리 패턴은 서로 관련있는 여러 객체를 만들어주는 인터페이스를 제공하는 패턴입니다.
    따라서 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우 사용됩니다.
  • 추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고 공통된 요소들을 갖는 개별 팩토리 그룹을 캡슐화하는 방법을 제공합니다.

추상 팩토리 패턴 구조


1. Abstract Product: product 패밀리를 구성하는 개별 연관 제품들의 집합에 대한 인터페이스를 선언합니다.
2. Concrete Product: abstract product들의 다양한 구현입니다.
3. Abstract Factory: 인터페이스는 각각의 abstract products를 생성하기 위한 여러 메서드들의 집합을 선언합니다.
4. Concrete Factory: abstract factory의 생성 메서드들을 구현합니다.
5. Client: Client는 추상화된 인터페이스만을 이용하여 product를 받기 때문에, concrete product, factory에 대해서는 모릅니다.

추상 팩토리 패턴 사용 예시

위와 같이 GUI를 구성하는 예제입니다.
첫째로 abstract factory부분을 만들어줍니다.

protocol GUIAbstractFactory {
    func createButton() -> Button
    func createCheckbox() -> Checkbox
}

protocol Button {
    func paint()
}

protocol Checkbox {
    func paint()
}

윈도우에서 사용할 것들을 만든다면?

class WinFactory: GUIAbstractFactory {
    func createButton() -> Button {
        return WinButton()
    }
    
    func createCheckbox() -> Checkbox {
        return WinCheckbox()
    }
    
}

class WinButton: Button {
    func paint() {
        print("윈도우 스타일로 버튼 렌더링")
    }
}

class WinCheckbox: Checkbox {
    func paint() {
        print("윈도우 스타일로 체크박스 렌더링")
    }
}

같은 방법으로 맥에서 사용하는 것을 구현하면

class MacFactory: GUIAbstractFactory {
    func createButton() -> Button {
        return MacButton()
    }
    
    func createCheckbox() -> Checkbox {
        return MacCheckbox()
    }
    
}

class MacButton: Button {
    func paint() {
        print("맥 스타일로 버튼 렌더링")
    }
}

class MacCheckbox: Checkbox {
    func paint() {
        print("맥 스타일로 체크박스 렌더링")
    }
}

비슷하게 다른 OS에서 사용하는 것을 만들 수 있습니다.

위와 같이 직접 OS를 신경쓰지 않도록 GUIFactory 객체를 하나 만들어 보겠습니다.

class GUIFactory {
    public static var factory: GUIAbstractFactory? {
        
        #if os(macOS)
        return MacFactory()
        #elseif os(Windows)
        return WinFactory()
        #elseif os(iOS)
        return iOSFactory()
        #else
        return nil
        #endif
    }
}

이렇게 다양한 요소 별로 객체의 집합을 생성해야 할 때 추상 팩토리 패턴이 유용한 것을 볼 수 있습니다.

장단점

장점

  • factory에서 생성되는 product들의 상호 호환을 보장할 수 있습니다.
  • concrete product들과 client사이에 코드 결합을 느슨하게 할 수 있습니다.
  • 단일책임원칙 : 제품 생성 코드를 한 곳으로 추출하여 코드를 더 쉽게 유지보수할 수 있습니다.
  • 개방/폐쇄원칙 : 기존 클라이언트 코드를 훼손하지 않고 제품의 새로운 변형들을 생성할 수 있습니다.

단점

  • 패턴과 함께 새로운 인터페이스들과 클래스들이 많이 도입되기 때문에 코드가 필요 이상으로 복잡해질 수 있습니다.

참고자료

profile
iOS시작~

0개의 댓글