Template 패턴은 어떤 공통의 일이 있으나 그 일이 세부적으로 분류에 따라 다르게 진행이 될 때, Template으로 큰 메서드를 만들고 상속받는 클래스에서 특성에 맞는 프로세스로 처리를 하는 디자인 패턴이다.
아래 예는 스타크래프트의 일꾼의 공통 일인 건물 짓기를 Template으로 하고 각 종족에 맞게 처리되는 예이다.
대표적인 예로는 Map -> HashMap, TreeMap
public abstract class Build {
// final로 재정의 금지
public final void Building(String building) {
checkArea();
startBuild();
endBuild();
System.out.println("건물 "+building+" 완료!");
}
public void checkArea() {
System.out.println("지을 수 있는 지형인지 확인");
}
public abstract void startBuild();
public abstract void endBuild();
}
public class Zerg extends Build {
private String name = "Drone";
@Override
public void endBuild() {
System.out.println("["+name+"] 파괴! 희생되었습니다.");
}
@Override
public void startBuild() {
System.out.println("["+name+"] 희생하여 건물을 짓고 있습니다.");
}
}
public class Protoss extends Build {
private String name = "Probe";
@Override
public void endBuild() {
System.out.println("["+name+"] 이미 다른일을 하고 있습니다.");
}
@Override
public void startBuild() {
System.out.println("["+name+"] 바로 다른 일을 할 수 있습니다.");
}
}
public class Terran extends Build {
private String name = "SCV";
@Override
public void endBuild() {
System.out.println("["+name+"] 일이 끝나 다른 일을 할 수 있습니다.");
}
@Override
public void startBuild() {
System.out.println("["+name+"] 열심히 건물을 짓기 시작합니다.");
}
}
public class MyProgram {
public static void main(String[] args) {
Build worker1 = new Protoss();
Build worker2 = new Zerg();
Build worker3 = new Terran();
worker1.Building("게이트웨이");
System.out.println("================");
worker2.Building("스포닝풀");
System.out.println("================");
worker3.Building("배럭");
}
}
지을 수 있는 지형인지 확인
[Probe] 바로 다른 일을 할 수 있습니다.
[Probe] 이미 다른일을 하고 있습니다.
건물 게이트웨이 완료!
================
지을 수 있는 지형인지 확인
[Drone] 희생하여 건물을 짓고 있습니다.
[Drone] 파괴! 희생되었습니다.
건물 스포닝풀 완료!
================
지을 수 있는 지형인지 확인
[SCV] 열심히 건물을 짓기 시작합니다.
[SCV] 일이 끝나 다른 일을 할 수 있습니다.
건물 배럭 완료!
큰 일이 정해져 있는데 그걸 나랑 너랑 하는 방식이 달라. 일단 크게 계획을 세우고 알아서 하자.