- Today
- Total
작심삼일
2주차. Abstract Factory Pattern (추상 팩토리 패턴) 본문
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
틀린 부분은 알려주시면 감사하겠습니다.
어떤 패턴인가
하나의 System이 여러 sub-module들로 구성되어 있다고 하자.
성적을 잘 받아 높은 등수를 얻기 위해서는 한 과목만 공부하면 안 된다. 모든 과목을 다 공부해야 한다.
'공부하기'라는 시스템을 실행시킬 때 그 안에 속한 '수학', '물리', '화학'을 모두 실행시켜야 하는 것이 Abstract Factory Pattern이다. 비슷한 제품 군을 묶어주는 역할을 하며, 내부를 건드리지 않을 수 있다는 것이 장점이다. 후에 서술할 Factory mathod를 한 번 더 추상화한다.
어떻게 쓰는가
Abstract Factory Pattern을 사용하면 실제 객체가 뭔지 몰라도 객체를 생성하고 조작할 수 있다.
from abc import *
class Math:
@abstractmethod
def readBook(self):
pass
class Physics:
@abstractmethod
def readBook(self):
pass
class Chemistry:
@abstractmethod
def readBook(self):
pass
class Study:
@abstractmethod
def studyMath(self):
return Math
@abstractmethod
def studyPhysics(self):
return Physics
@abstractmethod
def studyChemistry(self):
return Chemistry
위처럼 'Study'라는 Abstract Factory를 만들었다. 아래에서 이를 받아 사용할 것이다.
class Today_Plan(Study):
def studyMath(self):
return Today_Math
def studyPhysics(self):
return Today_Physics
def studyChemistry(self):
return Today_Chemistry
# ------------------------------------------------------
class Today_Math(Math):
def readBook(self):
print('수학 책 읽기')
class Today_Physics(Physics):
def readBook(self):
print('물리 책 읽기')
class Today_Chemistry(Chemistry):
def readBook(self):
print('화학 책 읽기')
'Study'라는 것을 상속했으면 @abstractmethod로 구현되어있기 때문에 그 안의 것들을 모두 사용해야 한다. 아래의 코드처럼 'Study'를 받았는데, 마음대로 'studyMath'를 지워버리면 안 된다.
# X
class Only_Science(Study):
def studyPhysics(self):
return Today_Physics
def studyChemistry(self):
return Today_Chemistry
# ------------------------------------------------------
class Today_Physics(Physics):
def readBook(self):
print('물리 책 읽기')
class Today_Chemistry(Chemistry):
def readBook(self):
print('화학 책 읽기')
# X
어디서 활용되는가
이는 책의 내용 (p.134 활용성)을 그대로 가져왔다.
1. 객체가 생성되거나 구성 & 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
2. 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한 번 구성한 제품을 다른 것으로 대체할 수 있을 때
'Study'에서 그대로 상속받았지만, 오늘은 책을 읽으며 공부하고 싶지 않고 문제를 풀고 싶다면 다음과 같이 바꿀 수 있다. 보통 테마를 만들 때 주로 사용한다고 한다.
class Today_Plan(Study):
def studyMath(self):
return Today_Math
def studyPhysics(self):
return Today_Physics
def studyChemistry(self):
return Today_Chemistry
# ------------------------------------------------------
class Today_Math(Math):
def readBook(self):
print('수학 문제 풀기')
class Today_Physics(Physics):
def readBook(self):
print('물리 문제 풀기')
class Today_Chemistry(Chemistry):
def readBook(self):
print('화학 문제 풀기')
3. 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
공부를 할 때 무조건 저 세 과목을 같이 공부해야 한다는 것이 함께 사용되도록 설계되었다는 의미이다.
class Study:
@abstractmethod
def studyMath(self):
return Math
@abstractmethod
def studyPhysics(self):
return Physics
@abstractmethod
def studyChemistry(self):
return Chemistry
4. 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
My Opinion
제품군이 3개 일 때를 예시로 들어서 잘 와 닿지 않을 수 있다. 하지만 제품군이 수십, 수백 개를 넘어갈 때 자칫하면 실수로 빼먹을 수 있다. Abstract Factory Pattern을 사용하면 그런 실수를 줄일 수 있다. 이런 장점 때문에 이 패턴을 사용하는 것이라 생각한다.
'스터디 > 디자인 패턴' 카테고리의 다른 글
4주차-2. Template Method (0) | 2021.05.13 |
---|---|
4주차-1. Prototype (0) | 2021.05.13 |
3주차-2. Singleton (0) | 2021.04.30 |
3주차-1. Factory Method (0) | 2021.04.30 |
1주차. 디자인 패턴이란? (0) | 2021.04.16 |