반응형
# 정의
객체 생성을 서브클래스에 위임하여 객체 생성과 사용을 분리하는 디자인 패턴
# 장점
1) 개방-폐쇄 원칙(OCP) 적용된다.
기존의 코드를 변경하지 않고 새로운 기능을 확장할 수 있다. 이렇게 개발하면 Product와 Concrete가 느슨하게 결합한다.
2) 결합도가 낮아진다.
3) 코드는 간결해지고 기존 코드가 복잡해지지 않는다.
# 단점
1) 각자의 역할을 나누다 보면 클래스가 늘어나는 게 단점이다.
# 예시
// Ship 인터페이스
type Ship interface { // 공통 동작을 정의
Color() string
}
type WhiteShip struct{}
func (c WhiteShip) Color() string {
return "color : white"
}
type BlockShip struct{}
func (r BlockShip) Color() string {
return "color : block"
}
// 팩토리 인터페이스
type ShipFactory interface {
CreateShip() Ship
}
// WhiteShipFactory 구현
type WhiteShipFactory struct{}
func (cf WhiteShipFactory) CreateShip() Ship {
return WhiteShip{}
}
// BlockShipFactory 구현
type BlockShipFactory struct{}
func (rf BlockShipFactory) CreateShip() Ship {
return BlockShip{}
}
- Ship 인터페이스는 공통 동작을 정의한다.
- ShapeFactory 인터페이스는 Ship 객체를 정의한다.
- 팩토리를 통하여 배를 만든다.
factoryA := ConcreteFactoryA{}
productA := factoryA.CreateProduct()
fmt.Println("Product A:", productA.GetName())
factoryB := ConcreteFactoryB{}
productB := factoryB.CreateProduct()
fmt.Println("Product B:", productB.GetName())
메인에 값을 불러 올 수 있다. 클래스가 아닌 팩토리를 통하여 객체를 생성할 수 있다.
# 결과
Product A: Concrete Product A
Product B: Concrete Product B
배의 종류는 점점 늘어날 것이다.
# 배 추가 하기
type PinkShip struct{}
func (r PinkShip) Color() string {
return "color : block"
}
type PinkShipFactory struct{}
func (rf PinkShipFactory) CreateShip() Ship {
return PinkShip{}
}
이렇게 계속 추가 해줘야해서 점점 함수가 늘어난다.
하지만 내가 새로운 배를 만든다고 해서 기존에 있던 배를 수정할 필요는 없다.
(핑크 배를 만든다고 해서 하얀배와 검정배가 수정되지 않는다)
# 공통 기능 추가
공통 기능으로 면적 계산하는걸 추가 해보자.
type Ship interface {
Color() string
CalculateArea() float64
}
하얀배에 공통 기능을 추가 해보자
type WhiteShip struct {
Size float64
}
func (c WhiteShip) Color() string {
return "color : white"
}
func (c WhiteShip) CalculateArea() float64 {
return c.Size * c.Size
}
type WhiteShipFactory struct{}
func (cf WhiteShipFactory) CreateShip() Ship {
return WhiteShip{Size: 5}
}
메인에서 불러 보자
whiteShipFactory := WhiteShipFactory{}
white := whiteShipFactory.CreateShip()
fmt.Println("배 색깔 : ", white.Color())
fmt.Println("배 크기 : ", white.CalculateArea())
결과는
배 색깔 : color : white
배 크기 : 25
# 참조 이슈
https://github.com/YooGenie/go-study/issues/74
반응형
'Study > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 프록시 패턴(Proxy Pattern) (0) | 2023.08.28 |
---|---|
[디자인패턴] 싱글톤 (0) | 2023.08.19 |
[디자인패턴] 시작 (0) | 2023.08.17 |