팩토리 패턴

인턴일지

목록 보기
1/7
post-thumbnail
인식률을 높이기 위해서 기호마다 인식 템플릿 제작
이를 if 구문을 이용해서, 밝기에 따라 다르게 제작한 인식 템플릿을 불러옴

ex) 밝은 배경 + 어두운 텍스트일 경우 quote_whiteBG() 인식 템플릿 불러옴
    어두운 배경 + 밝은 텍스트일 경우 quote_blackBG() 인식 템플릿 불러옴
    // 이렇게 다르게 제작한 이유는 전처리된 이미지에서 픽셀 단위로 템플릿을 제작한 후 
       배열화된 이미지과 인식 템플릿(픽셀 단위)를 비교하는 로직임. 
       

상황 정리:

  • 처음에는 인식률이 다소 떨어지는 기호가 다소 많지도 않았고, 제작할 템플릿이 그다지 많지 않았다.
  • 그런데, 기호 인식률을 높여주기 위해서 템플릿을 제작하려고 보니…
    2가지 텍스트 크기 x 디바이스별(모바일/ 태블릿 크기) x 배경색에 따른 구별(밝음/어두움)
    • 고려해야할 사항들이 늘어나면서, 기호마다 제작해야 할 인식 템플릿이 배로 늘어남에 따라 관리가 어려워짐.

⇒ 기호를 관리하던 컨피그 파일 관리 방식을 고도화 작업을 진행했다. (JSON -> 클래스화)


팩토리 메소드 패턴: 객체를 생성하기 위한 인터페이스 정의 시, 어떤 클래스의 인스턴스를 만들지 서브클래스에서 결정하는 패턴

객체 생성하는 코드 분리로 결합도(의존성)을 낮추는 패턴

  • 객체 추가/수정하더라도 객체를 생성하는 코드만 수정한다

Template Manager

▶︎ Template Factory

Template Manager

  • 여기서 템플릿을 직접 new()를 통해 생성하지 않고 TemplateFactory로부터 요청해서 받아옴 ⇒ 생성 책임을 TemplateFactory에게 위임함
def create_templates(self, bg_brightness: int):

	if bg_brightness < 78:
		self._create_template('minus', ...)
		self._create_template('equal', ...)
	else: 
		self._create_template('minus', ...)
		self._create_template('equal', ...)
	...
	
	return self._templates # 선언된 템플릿 딕셔너리
  • lang / device / 배경 밝기(bg_brightness) 조건에 따라 필요한 템플릿들을 만들어 self._templates 딕셔너리에 저장하는 함수

    구분설명
    create_templates()배경 밝기, 언어, 기기 조건에 맞춰 템플릿 생성
    _create_template()내부적으로 Factory를 호출하여 템플릿 객체 생성
    TemplateFactory.create_template()템플릿 타입에 맞는 클래스 인스턴스를 생성
    self._templates생성된 템플릿들이 여기에 저장됨 (캐싱 역할)
def _create_template(self, template_type: str, background: BackgroundColor, ...):
    size = ...
    thickness = ...
    template = TemplateFactory.create_template(template_type, size, thickness) # 요청 받은 템플릿 객체를 내부 로직에 따라 생성
    self._templates[template_type] = template.generate(background) # 생성할 템플릿 종류의 내부 구현 로직
  • TemplateFactory.create_template(...) → 템플릿 객체를 만들어줌 (팩토리 패턴 핵심 호출부)
  • template.generate(background) → 생성된 템플릿 인스턴스에게 일을 시킴 (SRP 분리) 기호마다 나눠놓은 템플릿 객체마다 호출되어있는 generate 함수 불러옴: 내부 구현 내용이라고 생각하면 됨

Template Factory

  • 다양한 템플릿 객체를 생성함: template type에 따라 플러스, 등호, 마이너스, 따옴표 등등 서로 다른 클래스의 인스턴스를 생성함
  • 클라이언트 코드에서는 내부 구현 내용을 몰라도 되고 기호 문자열만 넘겨줌

1. 템플릿 관리: 요청 받은 템플릿 클래스를 꺼내오는 구조
1) 키: 템플릿 이름 / 값: 클래스
2) 새로운 템플릿이 생기면 딕셔너리만 수정하면 됨

```python
_templates = {
    'plus': PlusTemplate,
    'minus': MinusTemplate,
    'equal': EqualTemplate,
    'quote': QuoteTemplate,
    'asterisk': AsteriskTemplate,
    # '새로운 기호' : 새로운 기호에 대한 클래스
}
```

2. 메서드
1) template_type에 따라 어떤 클래스의 인스턴스를 생성할 지 결정함
2) template_class(size, thickness) → 직접 인스턴스를 만들어서 반환

    @classmethod
    def create_template(cls, template_type, size, thickness=None):
        ...
        template_class = cls._templates[template_type]
        return template_class(size, thickness)

3. Template Interface
1) 모든 템플릿 클래스가 상속해야 할 추상 기반 클래스(인터페이스) 관리하는 파일
2) 사이즈 별로 템플릿 구조 제작

설계 요소장점
Template 추상 클래스각 템플릿 구현 간 공통 구조를 강제하여 일관성 유지
generate() 추상화각 템플릿 클래스가 고유의 생성 로직을 갖되, 공통 인터페이스로 다형성 제공
유틸 메서드중복 방지 + 공통 로직 캡슐화
Enum 사용매직 넘버 제거, 코드 안정성 향상

두고 두고 사용할 수 있는 디자인 패턴으로 다른 패턴들도 익혀두자!

profile
밝은 미래 FE 개발자의 기록

0개의 댓글