본문 바로가기
golang/design pattern

golang design pattern #2 Factory

by PudgeKim 2021. 11. 10.

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