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