작심삼일

2주차. Abstract Factory Pattern (추상 팩토리 패턴) 본문

스터디/디자인 패턴

2주차. Abstract Factory Pattern (추상 팩토리 패턴)

yun_s 2021. 4. 22. 23:37
728x90
반응형

디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.

틀린 부분은 알려주시면 감사하겠습니다.

어떤 패턴인가

하나의 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을 사용하면 그런 실수를 줄일 수 있다. 이런 장점 때문에 이 패턴을 사용하는 것이라 생각한다.

728x90
반응형

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

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
Comments