Java 디자인패턴 - 템플릿 메소드 패턴
이번 시간에는 자바 디자인 패턴 중 빈번하게 사용되는 템플릿 메소드 패턴 (Template Method Pattern)에
대해서 간단한 예제와 함께 설명 드리려 합니다.
템플릿 메소드 패턴은 어떤 소스코드상의 알고리즘에서 특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용한 패턴입니다.
추상클래스와 구현클래스로 작성할 수 있으며, 메인이 되는 로직 부분은 추상클래스의 일반 메소드로 선언해서 사용합니다. 즉, 구현별로 달라질 수 있는 행동(메소드)들은 구현 클래스에서 선언 후 호출하는 방식으로
사용합니다.
해당 패턴은 아래와 같은 장단점이 있습니다.
장점
- 코드 중복 감소
- 자식 클래스의 역할(롤)을 감소시키면서 핵심로직 관리 용이
- 객체 추가 및 확장 쉽게 가능
단점
- 추상메소드가 너무 많아지면 클래스 관리가 복잡
- 추상클래스와 구현클래스간 복잡성 증대
아래 설명을 읽어보시고 예제 소스코드를 학습하시면 쉽게 이해하실 수 있을 거라 생각합니다.
Java 관련 포스팅 : Java 관련
Java 관련 포스팅 : Java 관련
Template Method Pattern - 구조 설명
아래와 다이어그램으로 나타낼 수 있으며, 세부 항목은 하단에서 설명합니다.
템플릿 메소드 패턴 구조(Structure)
Template Method Pattern - 예제 소스 코드
위에 템플릿 메소드 패턴을 적용한 4개의 파일로 구성되어 있는 Wooden House, GlassHouse
와 같이
집을 건축해보는 예제 소스 코드 입니다. HouseTemplate
클래스가 이번 패턴의 핵심적인 파일입니다.
어렵지 않은 내용이니 차근차근 소스코드를 분석해 보시기 바랍니다.
GlassHouse.java
12345678910111213 public class GlassHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Glass Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with glass coating"); } } cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class GlassHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Glass Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with glass coating"); } } | cs |
WoodenHouse.java
WoodenHouse.java
12345678910111213 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"); } } cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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"); } } | cs |
HouseTemplate.java
123456789101112131415161718192021222324 public abstract class HouseTemplate { //final 선언으로 Override 방지 public final void buildHouse(){ buildFoundation(); buildPillars(); buildWalls(); buildWindows(); System.out.println("House is built."); } //기본으로 구현 private void buildWindows() { System.out.println("Building Glass Windows"); } //서브클래스에서 직접 구현 할 메소드 public abstract void buildWalls(); public abstract void buildPillars(); private void buildFoundation() { System.out.println("Building foundation with cement,iron rods and sand"); }} cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public abstract class HouseTemplate { //final 선언으로 Override 방지 public final void buildHouse(){ buildFoundation(); buildPillars(); buildWalls(); buildWindows(); System.out.println("House is built."); } //기본으로 구현 private void buildWindows() { System.out.println("Building Glass Windows"); } //서브클래스에서 직접 구현 할 메소드 public abstract void buildWalls(); public abstract void buildPillars(); private void buildFoundation() { System.out.println("Building foundation with cement,iron rods and sand"); } } | cs |
HousingMain.java
HousingMain.java
1234567891011121314151617181920 public class HousingMain { public static void main(String[] args) { //템플릿 메소드 사용(Wooden House) HouseTemplate houseType = new WoodenHouse(); houseType.buildHouse(); //구분 선 삽입 System.out.println(); System.out.println("************"); System.out.println(); //템플릿 메소드 사용(Glass House) houseType = new GlassHouse(); houseType.buildHouse(); }} cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class HousingMain { public static void main(String[] args) { //템플릿 메소드 사용(Wooden House) HouseTemplate houseType = new WoodenHouse(); houseType.buildHouse(); //구분 선 삽입 System.out.println(); System.out.println("************"); System.out.println(); //템플릿 메소드 사용(Glass House) houseType = new GlassHouse(); houseType.buildHouse(); } } | cs |
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Template Method Pattern - 클래스 다이어그램(UML) 및 예제 실행
위의 예제는 아래와 같은 클래스 다이어그램으로 표현 가능합니다.
Class Diagram
소스 코드 작성 후 실행하시면 아래와 같이 동작하는 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
추상클래스를 통해서 메소드에 알고리즘의 골격을 정의해서 사용하는 템플릿 메소드 패턴은 여러 가지
이점을 제공합니다.
소스코드의 중복을 줄이기 위해 하위클래스에서 빈번하고 공통적으로 나타나는 부분에 대해서 별도의
추상클래스를 정의해서 사용하는 것이 핵심입니다.
즉, 클래스 라이브러리 작성 시 공통된 부분을 추출 하는 부분에서 이점을 제공하고 이를 통해서 확장을
쉽게 가능하게 해주는 패턴이라고 볼 수 있습니다.
다음 포스팅에서는 자바 팩토리 메소드 패턴(Factory Method Pattern)에 대해 설명하겠습니다.
감사합니다.
소스코드 다운로드 : template_m-pattern.zip
'언어 > Java' 카테고리의 다른 글
Java(자바) 알고리즘 - 나이브베이지안(Naive Bayesian) 오픈소스 및 예제 (0) | 2018.10.15 |
---|---|
Java(자바) 디자인패턴 - 팩토리(Factory Method) 패턴 설명 및 예제소스 (7) | 2018.05.21 |
Java(자바) 디자인패턴 - 어댑터(Adapter) 패턴 설명 및 예제소스 (0) | 2018.05.15 |
Java(자바) 디자인패턴 - 전략(Strategy) 패턴 설명 및 예제소스 (3) | 2018.04.18 |
Java(자바) Runtime - 외부 프로세스(exec) 실행 예제 소스 (3) | 2017.12.29 |