Factory 패턴은 기존 class가 있는 언어들의 constructor와 유사합니다.
1
2
3
4
5
6
7
8
9
10
11
|
type Person struct {
name string
age int
}
func New(name string, age int) *Person {
return &Person{
name: name,
age: age,
}
}
|
cs |
보다시피 constructor와 거의 비슷하며 해당 함수에 여러 조건을 추가할 수도 있습니다.
참고로 보통 이러한 함수를 만들 때 NewPerson보다는 New라는 이름의 함수로 많이 사용합니다.
왜냐하면 보통 이런 경우 package 이름이 person일테고 그럼 해당 함수를 사용할 때
p := person.New(..) 이렇게 사용할 것이므로
굳이 person.NewPerson(..) 이렇게 person이 중복되게 할 필요가 없기 때문입니다.
즉, package 이름으로 인해 유추가 충분히 가능합니다.
이러한 Factory 패턴을 interface와 결합하면 아래처럼 사용도 가능합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
type Person interface {
sayHi()
}
// return type이 interface
func New(name string, age int) Person {
if age >= 50 {
return &oldPerson{name, age}
}
return &youngPerson{name, age}
}
type youngPerson struct {
name string
age int
}
func (yp *youngPerson) sayHi() {
fmt.Println("Hi I'm young person!")
}
type oldPerson struct {
name string
age int
}
func (op *oldPerson) sayHi() {
fmt.Println("Hi I'm old person!")
}
|
cs |
youngPerson과 oldPerson 2개의 타입이 있지만 New 함수는 return 타입으로 Person이라는 interface 타입을
return 합니다.
사용자 입장에서는 내부를 볼 필요 없이 나이에 따라 youngPerson과 oldPerson이 생성되고
어떤 것이 생성이 되든 둘 다 Person 타입이므로 Person 타입을 필요로 하는 함수에 사용할 수 있습니다.
Go언어는 일급함수의 특징을 가지고 있는데 이 특징을 활용하면 아래와 같은 코드도 작성이 가능합니다.
1
2
3
4
5
6
7
8
9
10
11
|
type Person struct {
sex string
job string
name string
}
func NewFactory(sex, job string) func(name string) *Person {
return func(name string) *Person {
return &Person{sex, job, name}
}
}
|
cs |
NewFactory 함수의 return 타입을 잘보시면 함수입니다.
*Person 타입을 return 하는 함수를 리턴하는 것이죠.
1
2
3
4
5
|
girlDoctorFactory := NewFactory("girl", "doctor")
boyDeveloperFactory := NewFactory("boy", "developer")
sarah := girlDoctorFactory("sarah")
tim := boyDeveloperFactory("tim")
|
cs |
여자인 의사는 한 둘이 아닐거고 마찬가지로 남자이면서 개발자인 사람도 엄청 많을 것입니다.
이렇게 함수를 리턴하는 함수를 만듬으로써 성별과 직업은 공통되게하면서 이름만 다르게 만들 수 있습니다.
'golang > design pattern' 카테고리의 다른 글
golang design pattern #6 Bridge (0) | 2021.11.12 |
---|---|
golang design pattern #5 Adapter (0) | 2021.11.12 |
golang design pattern #4 Singleton (0) | 2021.11.11 |
golang design pattern #3 Prototype (0) | 2021.11.11 |
golang design pattern #1 Builder (0) | 2021.11.10 |