
인식률을 높이기 위해서 기호마다 인식 템플릿 제작
이를 if 구문을 이용해서, 밝기에 따라 다르게 제작한 인식 템플릿을 불러옴
ex) 밝은 배경 + 어두운 텍스트일 경우 quote_whiteBG() 인식 템플릿 불러옴
어두운 배경 + 밝은 텍스트일 경우 quote_blackBG() 인식 템플릿 불러옴
// 이렇게 다르게 제작한 이유는 전처리된 이미지에서 픽셀 단위로 템플릿을 제작한 후
배열화된 이미지과 인식 템플릿(픽셀 단위)를 비교하는 로직임.
상황 정리:
⇒ 기호를 관리하던 컨피그 파일 관리 방식을 고도화 작업을 진행했다. (JSON -> 클래스화)
팩토리 메소드 패턴: 객체를 생성하기 위한 인터페이스 정의 시, 어떤 클래스의 인스턴스를 만들지 서브클래스에서 결정하는 패턴
객체 생성하는 코드 분리로 결합도(의존성)을 낮추는 패턴
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 # 선언된 템플릿 딕셔너리
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 함수 불러옴: 내부 구현 내용이라고 생각하면 됨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 사용 | 매직 넘버 제거, 코드 안정성 향상 |
두고 두고 사용할 수 있는 디자인 패턴으로 다른 패턴들도 익혀두자!