Appearance
디자인 패턴 _ Template Method Pattern
[디자인 패턴 예]
템플릿 메서드 패턴
특정 환경 or 상황에 맞게 확장, 변경할 때 유용한 패턴
추상 클래스, 구현 클래스 둘로 구분.
추상클래스 (Abstract Class) : 메인이 되는 로직 부분은 일반 메소드로 선언해 둠.
구현클래스 (Concrete Class) : 메소드를 선언 후 호출하는 방식.
- 장점
- 구현 클래스에서는 추상 클래스에 선언된 메소드만 사용하므로, 핵심 로직 관리가 용이
- 객체 추가 및 확장 가능
- 단점
- 추상 메소드가 많아지면, 클래스 관리가 복잡함.
설명
- HouseTemplate.java
Template 추상 클래스를 하나 생성. (예, HouseTemplate)
이 HouseTemplate을 사용할 때는,
"HouseTemplate houseType = new WoodenHouse()" 이런 식으로 넣음.
HouseTemplate 내부에 **buildHouse**라는 변해서는 안되는 핵심 로직을 만들어 놓음. (장점 1)
Template 클래스 내부의 **핵심 로직 내부의 함수**를 상속하는 클래스가 직접 구현하도록, abstract를 지정해 둠.
javapublic 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) }- WoodenHouse.java (GlassHouse.java도 가능)
HouseTemplate을 상속받는 클래스.
Wooden이나, Glass에 따라서 buildHouse 내부의 핵심 로직이 바뀔 수 있으므로,
이 부분을 반드시 선언하도록 지정해둠.
javapublic 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"); } }
- 장점