Gof의 디자인 패턴 - 팩토리 메서드

Groot·2023년 12월 10일
0

TIL

목록 보기
135/153
post-thumbnail
post-custom-banner

팩토리 메서드

  • 생성패턴
  • 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴
  • 단일 책임 원칙. 제품 생성 코드를 프로그램의 한 위치로 이동하여 코드를 더 쉽게 유지관리
  • 개방/폐쇄 원칙. 당신은 기존 클라이언트 코드를 훼손하지 않고 새로운 유형의 제품들을 프로그램에 도입

활용성

  • 특정 객체가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
  • 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때

구조

요소

  • 프로덕트
    • 팩토리 메서드가 생성하는 객체의 인터페이스를 정의
  • 구체화 프로덕트
    • 프로덕트 인터페이스 실제 구현
  • 크리에이터
    • 프로턱트 타입의 객체를 반환하는 팩토리 메서드 선언
  • 구체화 크리에이터
    • 팩토리 메서드를 재정의하여 구체화 프로덕트 인스턴스 반환

장점

  • 서브클래스에 대한 훅 메서드 제공
  • 크리에이터와 구체화 프로덕트들이 단단하게 결합되지 않도록 할 수 있다.

단점

  • 패턴을 구현하기 위해 많은 새로운 자식 클래스들을 도입해야 하므로 코드가 더 복잡해질 수 있다. 가장 좋은 방법은 크리에이터 클래스들의 기존 계층구조에 패턴을 도입하는 것.

예시 코드

// 프로토콜을 정의합니다.
protocol Product {
    func operation() -> String
}

// Product 프로토콜을 따르는 구체적인 클래스를 생성합니다.
class ConcreteProductA: Product {
    func operation() -> String {
        return "ConcreteProductA operation"
    }
}

class ConcreteProductB: Product {
    func operation() -> String {
        return "ConcreteProductB operation"
    }
}

// 팩토리 클래스를 생성합니다.
class Creator {
    // 팩토리 메서드를 정의합니다.
    func factoryMethod() -> Product {
        fatalError("Subclasses must override this method")
    }
    
    // 클라이언트 코드에서 사용될 메서드입니다.
    func someOperation() -> String {
        let product = factoryMethod()
        return "Creator: \(product.operation())"
    }
}

// Creator 클래스를 상속하여 팩토리 메서드를 구체화합니다.
class ConcreteCreatorA: Creator {
    override func factoryMethod() -> Product {
        return ConcreteProductA()
    }
}

class ConcreteCreatorB: Creator {
    override func factoryMethod() -> Product {
        return ConcreteProductB()
    }
}

// 사용 예시
let creatorA = ConcreteCreatorA()
print(creatorA.someOperation()) // 출력: "Creator: ConcreteProductA operation"

let creatorB = ConcreteCreatorB()
print(creatorB.someOperation()) // 출력: "Creator: ConcreteProductB operation"

참고

profile
I Am Groot
post-custom-banner

0개의 댓글