Design Pattern Template Method
기술노트
디자인 패턴 _ Template Method Pattern
---
[디자인 패턴 예]
1. 템플릿 메서드 패턴
특정 환경 or 상황에 맞게 확장, 변경할 때 유용한 패턴
추상 클래스, 구현 클래스 둘로 구분.
추상클래스 (Abstract Class) : 메인이 되는 로직 부분은 일반 메소드로 선언해 둠.
구현클래스 (Concrete Class) : 메소드를 선언 후 호출하는 방식.
- 장점 - 구현 클래스에서는 추상 클래스에 선언된 메소드만 사용하므로, 핵심 로직 관리가 용이 - 객체 추가 및 확장 가능 - 단점 - 추상 메소드가 많아지면, 클래스 관리가 복잡함.
* 설명
1) HouseTemplate.java
> Template 추상 클래스를 하나 생성. (예, HouseTemplate) > > 이 HouseTemplate을 사용할 때는, > > "HouseTemplate houseType = new WoodenHouse()" 이런 식으로 넣음. > > HouseTemplate 내부에 buildHouse라는 변해서는 안되는 핵심 로직을 만들어 놓음. (장점 1) > > Template 클래스 내부의 핵심 로직 내부의 함수를 상속하는 클래스가 직접 구현하도록, abstract를 지정해 둠.
java
public abstract class HouseTemplate {
// 이런 식으로 buildHouse라는 함수 (핵심 로직)을 선언해 둠.
public final void buildHouse() {
buildFoundation(); // (1)
buildPillars(); // (2)
buildWalls(); // (3)
buildWindows(); // (4)
System.out.println("House is built.");
}
// buildFoundation(); 정의 부분 (1)
// buildWalls(); 정의 부분 (2)
// 위의 두 함수와는 다르게 이 클래스를 상속받는 클래스가 별도로 구현했으면 하는 메소드들은 abstract로 선언하여, 정의하도록 함
public abstract void buildWalls(); // (3)
public abstract void buildPillars();// (4)
}
2) WoodenHouse.java (GlassHouse.java도 가능)
> HouseTemplate을 상속받는 클래스. > > Wooden이나, Glass에 따라서 buildHouse 내부의 핵심 로직이 바뀔 수 있으므로, > > 이 부분을 반드시 선언하도록 지정해둠.
java
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}