[swift] Factory 디자인 패턴
Factory 디자인 패턴은 객체를 생성하기 위한 디자인 패턴으로, 객체 생성을 담당하는 별도의 클래스를 제공하여 클라이언트로 하여금 새로운 객체를 직접 생성하지 않고 팩토리 클래스에 요청함으로써 객체 생성을 캡슐화하는 방법입니다.
Factory 디자인 패턴의 구조
Factory 디자인 패턴은 Creator, ConcreteCreator, Product, ConcreteProduct 4가지 주요 구성 요소로 구성됩니다.
- Creator: Product 객체를 생성하는 팩토리 메서드를 선언하는 인터페이스입니다.
- ConcreteCreator: 실제로 Product 객체를 생성하고 반환하는 구체적인 Creator 클래스입니다.
- Product: 생성될 객체의 인터페이스 또는 추상 클래스입니다.
- ConcreteProduct: 실제로 생성되는 객체로, Product 인터페이스를 구현한 클래스입니다.
Factory 디자인 패턴의 장점
Factory 디자인 패턴을 사용하면 다음과 같은 장점을 얻을 수 있습니다.
- 객체 생성의 캡슐화: 클라이언트는 객체 생성을 담당하는 코드를 알 필요 없이 팩토리 클래스에 객체 생성을 요청함으로써 캡슐화된 방법으로 객체를 생성할 수 있습니다.
- 유연성: 객체 생성 로직을 팩토리 클래스에 캡슐화함으로써, 객체 생성 방식의 변경이 용이해집니다.
예시
protocol Product {
func operate()
}
class ConcreteProductA: Product {
func operate() {
print("Operating ConcreteProductA")
}
}
class ConcreteProductB: Product {
func operate() {
print("Operating ConcreteProductB")
}
}
protocol Creator {
func createProduct() -> Product
}
class ConcreteCreatorA: Creator {
func createProduct() -> Product {
return ConcreteProductA()
}
}
class ConcreteCreatorB: Creator {
func createProduct() -> Product {
return ConcreteProductB()
}
}
let creatorA: Creator = ConcreteCreatorA()
let productA = creatorA.createProduct()
productA.operate()
let creatorB: Creator = ConcreteCreatorB()
let productB = creatorB.createProduct()
productB.operate()
위 예시에서는 Product
와 Creator
프로토콜이 정의되어 있고, ConcreteProductA
, ConcreteProductB
클래스가 Product
프로토콜을 구현합니다. 마찬가지로, ConcreteCreatorA
, ConcreteCreatorB
클래스가 Creator
프로토콜을 구현하여, 각각의 팩토리 메서드에서 해당하는 ConcreteProductA
와 ConcreteProductB
객체를 생성하여 반환합니다.
요약
Factory 디자인 패턴은 객체를 생성하기 위한 인터페이스를 정의하여, 서브 클래스가 어떤 클래스의 인스턴스를 생성할지를 결정하도록 하는 디자인 패턴입니다. 객체 생성과 클라이언트 코드는 분리됨으로써 코드의 응집도를 높일 수 있고, 유연성을 확보할 수 있습니다.