1. Factory Method Pattern이란
Factory Method Pattern은 서브클래스에서 객체 생성 프로세스를 캡슐화하는 생성 디자인 패턴으로, 이를 통해 클라이언트는 특정 객체 생성 프로세스를 걱정하지 않고 팩토리 메서드를 호출하여 객체를 생성할 수 있습니다.
2. Factory Method Pattern의 특징과 장점
Factory Method Pattern의 특징은 다음과 같습니다:
- 객체의 생성과 사용을 분리하여 클라이언트는 팩토리 메서드와 추상 제품 인터페이스에만 신경써야 합니다.
- 시스템은 새로운 구체적인 팩토리 클래스와 제품 클래스를 추가하여 Open/Closed Principle을 준수할 수 있습니다.
Factory Method Pattern의 장점은 다음과 같습니다:
- 객체 생성 프로세스를 캡슐화하여 시스템을 더 유연하고 확장 가능하게 합니다.
- 특정 제품 클래스의 구현 세부 정보를 숨겨 클라이언트의 종속성과 결합을 줄입니다.
- 제품을 생성하는 표준화된 방법을 제공하여 시스템 유지보수와 확장을 촉진합니다.
3. Factory Method Pattern의 적용 시나리오
Factory Method Pattern은 다음 시나리오에 적합합니다:
- 클라이언트가 특정 제품 클래스에 의존하지 않고 추상 제품 인터페이스에 의존하는 경우
- 클라이언트가 다른 조건에 따라 동적으로 다양한 제품 객체를 생성해야 하는 경우
- 제품 객체 생성 프로세스를 캡슐화하고 숨겨야 하는 경우
4. Golang에서 Factory Method Pattern의 구현
4.1 UML 클래스 다이어그램
4.2 구현 단계 1: 추상 제품 인터페이스 정의
package factory
// Product는 추상 제품 인터페이스입니다.
type Product interface {
Operation() string
}
4.3 구현 단계 2: 구체적인 제품 구현 클래스 생성
package factory
// ConcreteProductA는 구체적인 제품 클래스 A입니다.
type ConcreteProductA struct{}
// Operation은 구체적인 제품 A 클래스의 메서드입니다.
func (p *ConcreteProductA) Operation() string {
return "ConcreteProductA"
}
// ConcreteProductB는 구체적인 제품 클래스 B입니다.
type ConcreteProductB struct{}
// Operation은 구체적인 제품 B 클래스의 메서드입니다.
func (p *ConcreteProductB) Operation() string {
return "ConcreteProductB"
}
4.4 구현 단계 3: 추상 팩토리 인터페이스 정의
package factory
// Factory는 추상 팩토리 인터페이스입니다.
type Factory interface {
CreateProduct() Product
}
4.5 구현 단계 4: 구체적인 팩토리 구현 클래스 생성
package factory
// ConcreteFactoryA는 구체적인 팩토리 클래스 A입니다.
type ConcreteFactoryA struct{}
// CreateProduct는 구체적인 팩토리 A 클래스의 메서드입니다.
func (f *ConcreteFactoryA) CreateProduct() Product {
return &ConcreteProductA{}
}
// ConcreteFactoryB는 구체적인 팩토리 클래스 B입니다.
type ConcreteFactoryB struct{}
// CreateProduct는 구체적인 팩토리 B 클래스의 메서드입니다.
func (f *ConcreteFactoryB) CreateProduct() Product {
return &ConcreteProductB{}
}
4.6 구현 단계 5: 클라이언트가 팩토리 메서드를 호출하여 제품 객체 생성
package main
import (
"fmt"
"github.com/your/package/factory"
)
func main() {
// Concrete Factory A 생성
factoryA := &factory.ConcreteFactoryA{}
// 팩토리 메서드를 호출하여 제품 객체를 생성합니다.
productA := factoryA.CreateProduct()
fmt.Println(productA.Operation())
// Concrete Factory B 생성
factoryB := &factory.ConcreteFactoryB{}
// 팩토리 메서드를 호출하여 제품 객체를 생성합니다.
productB := factoryB.CreateProduct()
fmt.Println(productB.Operation())
}
위의 코드에서 추상 제품 인터페이스 Product
와 구체적인 제품 클래스 ConcreteProductA
와 ConcreteProductB
를 정의합니다. 그런 다음 추상 팩토리 인터페이스 Factory
와 구체적인 팩토리 클래스 ConcreteFactoryA
와 ConcreteFactoryB
를 정의합니다. 클라이언트는 구체적인 팩토리 클래스의 팩토리 메서드를 호출하여 특정 제품 객체를 생성할 수 있으므로 Factory Method 패턴을 구현합니다.
위의 단계로 Golang에서 Factory Method Pattern의 구현을 완료했습니다. 이 접근 방식은 클라이언트를 특정 제품 클래스에서 분리하여 클라이언트가 추상 제품 인터페이스에만 집중할 수 있도록 합니다. 한편, 특정 제품 클래스의 구현 세부 정보는 구체적인 팩토리 클래스에 캡슐화되어 시스템을 더 유연하고 확장 가능하게 만듭니다. Factory Method Pattern은 동적으로 다양한 유형의 객체를 생성해야 하는 시나리오에서 특히 유용하며, 코드 재사용성과 유지보수성을 효과적으로 향상시킵니다.