템플릿 메서드 패턴(Template Method Pattern)
- 템플릿 메서드 패턴은 행위패턴(Behavioral Pattern) 중 하나이다.
- 행위 패턴은 객체 사이에 알고리즘이나 책임 분배에 관련된 패턴이다.
- 행위 패턴은 결합도를 최소화하는 것에 목표로 한다.
목적
"작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다.
템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다." [GOF]
쉽게 이야기하면 부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것이다.
이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있다.
결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것이다.
장점
- 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하는데 유용하다.
- 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른 형태로 사용이 필요한 경우 유용하다.
코드
* FactoryTemplate이라는 공장 템플릿 추상화 클래스를 이용해서 자동차, 폰 공장에서는 상품생산 프로세스만 다르게 구성한다고 설정
- FactoryTemplate.java (추상화 클래스)
public abstract class FactoryTemplate {
public final void buildProduct() {
baseMaterial();
productProcess();
finishProduct();
}
private void baseMaterial() {
System.out.println("원/부자재 수입");
}
public abstract void productProcess();
private void finishProduct() {
System.out.println("제품 완성");
}
}
- 자동차 공장 Class
public class CarFactory extends FactoryTemplate{
@Override
public void productProcess() {
System.out.println("자동차 공장 프로세스 가동!");
}
}
- 핸드폰 공장 Class
public class PhoneFactory extends FactoryTemplate {
@Override
public void productProcess() {
System.out.println("핸드폰 공장 프로세스 가동!");
}
}
- 테스트 Class
@SpringBootTest
class FactoryTemplateTest {
@Test
void templatePatternTest() {
FactoryTemplate factory;
factory = new CarFactory();
factory.buildProduct();
System.out.println("=======================");
factory= new PhoneFactory();
factory.buildProduct();
}
}
결과 :
원 부자재 수입
자동차 공장 프로세스 가동!
제품 완성
=======================
원 부자재 수입
핸드폰 공장 프로세스 가동!
제품 완성
정리
- 추상화 클래스에서 메서드에 알고리즘 골격을 정의하고, 소스코드의 중복을 줄이기 위해서 하위 클래스에서 공통적으로 나타나는 부분에 대해서 추상클래스에 정의해서 사용한다.
* 핵심 템플릿 클래스가 abstract 추상 클래스임을 인지하자
참조
- https://niceman.tistory.com/142
- https://yaboong.github.io/design-pattern/2018/09/27/template-method-pattern/
'JAVA > Design Pettern' 카테고리의 다른 글
[Design Pattern] 커맨드 패턴 (0) | 2022.03.25 |
---|---|
[Design Pattern] 책임 사슬 패턴 (0) | 2022.03.24 |
[Design Pattern] 프록시 패턴 (0) | 2022.03.22 |
[Design Pattern] 추상 팩토리 패턴 (0) | 2022.03.19 |
[Design Pattern] 어댑터 패턴 (0) | 2022.03.16 |