
Go로 작성된 팩토리 메서드
팩토리 메서드는 제품 객체들의 구상 클래스들을 지정하지 않고 해당 제품 객체들을 생성할 수 있도록 하는 생성 디자인 패턴입니다.
팩토리 메서드는 메서드를 정의하며, 이 메서드는 직접 생성자 호출(new
연산자)을 사용하여 객체를 생성하는 대신 객체 생성에 사용되여야 합니다. 자식 클래스들은 이 메서드를 오버라이드하여 생성될 객체들의 클래스를 변경할 수 있습니다.
다양한 팩토리 패턴들과 개념들의 차이점을 이해하지 못하셨다면 팩토리 비교를 읽어보세요.
개념적인 예시
클래스 및 상속과 같은 객체 지향 프로그램 기능이 없으므로 Go에서 고전적인 팩토리 메서드 패턴을 구현하는 것은 불가능하나 여전히 Go에서 패턴의 기본 버전인 단순 팩토리(Simple Factory)를 구현할 수 있습니다.
이 예시에서는 팩토리 구조체(struct)를 사용하여 다양한 유형의 무기를 만들 것입니다.
먼저 총에 있어야 하는 모든 메서드들을 정의하는 iGun
인터페이스를 만듭니다. iGun 인터페이스를 구현하는 gun
구조체(struct) 유형이 있습니다. 두 개의 구상 총들(ak47
및 musket
)은 총 구조체(struct)를 포함하고 모든 iGun
메서드들을 간접적으로 구현합니다.
gunFactory
구조체(struct)는 팩토리의 역할을 하며, 수신된 인수를 기반으로 요청된 유형의 총들을 생성합니다. main.go는 클라이언트의 역할을 하며 ak47
또는 musket
과 직접 상호작용하는 대신 gunFactory
에 의존하여 다양한 총들의 인스턴스를 생성하고, 생성을 문자열 매개변수만 사용하여 제어합니다.
iGun.go: 제품 인터페이스
package main type IGun interface { setName(name string) setPower(power int) getName() string getPower() int }
gun.go: 구상 제품
package main type Gun struct { name string power int } func (g *Gun) setName(name string) { g.name = name } func (g *Gun) getName() string { return g.name } func (g *Gun) setPower(power int) { g.power = power } func (g *Gun) getPower() int { return g.power }
ak47.go: 구상 제품
package main type Ak47 struct { Gun } func newAk47() IGun { return &Ak47{ Gun: Gun{ name: "AK47 gun", power: 4, }, } }
musket.go: 구상 제품
package main type musket struct { Gun } func newMusket() IGun { return &musket{ Gun: Gun{ name: "Musket gun", power: 1, }, } }
gunFactory.go: 팩토리
package main import "fmt" func getGun(gunType string) (IGun, error) { if gunType == "ak47" { return newAk47(), nil } if gunType == "musket" { return newMusket(), nil } return nil, fmt.Errorf("Wrong gun type passed") }
main.go: 클라이언트 코드
package main import "fmt" func main() { ak47, _ := getGun("ak47") musket, _ := getGun("musket") printDetails(ak47) printDetails(musket) } func printDetails(g IGun) { fmt.Printf("Gun: %s", g.getName()) fmt.Println() fmt.Printf("Power: %d", g.getPower()) fmt.Println() }
output.txt: 실행 결과
Gun: AK47 gun Power: 4 Gun: Musket gun Power: 1