괴발개발 성장기

Study/디자인패턴

[디자인패턴] 팩토리 메소드 패턴(Factory Method Pattern)

지니유 2023. 8. 23. 13:30
반응형

# 정의

객체 생성을 서브클래스에 위임하여 객체 생성과 사용을 분리하는 디자인 패턴

 

# 장점

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

 

팩토리 메소드 패턴 · Issue #74 · YooGenie/go-study

 

github.com

 

반응형

'Study > 디자인패턴' 카테고리의 다른 글

[디자인패턴] 프록시 패턴(Proxy Pattern)  (0) 2023.08.28
[디자인패턴] 싱글톤  (0) 2023.08.19
[디자인패턴] 시작  (0) 2023.08.17