팩토리 메서드
- 생성패턴
- 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴
- 단일 책임 원칙. 제품 생성 코드를 프로그램의 한 위치로 이동하여 코드를 더 쉽게 유지관리
- 개방/폐쇄 원칙. 당신은 기존 클라이언트 코드를 훼손하지 않고 새로운 유형의 제품들을 프로그램에 도입
활용성
- 특정 객체가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
- 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때
구조
요소
- 프로덕트
- 팩토리 메서드가 생성하는 객체의 인터페이스를 정의
- 구체화 프로덕트
- 크리에이터
- 프로턱트 타입의 객체를 반환하는 팩토리 메서드 선언
- 구체화 크리에이터
- 팩토리 메서드를 재정의하여 구체화 프로덕트 인스턴스 반환
장점
- 서브클래스에 대한 훅 메서드 제공
- 크리에이터와 구체화 프로덕트들이 단단하게 결합되지 않도록 할 수 있다.
단점
- 패턴을 구현하기 위해 많은 새로운 자식 클래스들을 도입해야 하므로 코드가 더 복잡해질 수 있다. 가장 좋은 방법은 크리에이터 클래스들의 기존 계층구조에 패턴을 도입하는 것.
예시 코드
protocol Product {
func operation() -> String
}
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())"
}
}
class ConcreteCreatorA: Creator {
override func factoryMethod() -> Product {
return ConcreteProductA()
}
}
class ConcreteCreatorB: Creator {
override func factoryMethod() -> Product {
return ConcreteProductB()
}
}
let creatorA = ConcreteCreatorA()
print(creatorA.someOperation())
let creatorB = ConcreteCreatorB()
print(creatorB.someOperation())
참고