템플릿 메서드 패턴, 팩토리 메서드 패턴, 추상 팩토리 패턴
템플릿 메서드 패턴
public abstract class WoowaTechCourse {
public void dailyRoutine() {
goWork();
haveClass();
study();
leaveWork();
}
public void goWork() {
System.out.println("출근");
}
public void haveClass() {
WoowaClass woowaClass = new WoowaClassSelector().brownClass();
woowaClass.classOwner();
}
public void leaveWork() {
System.out.println("퇴근");
}
public abstract void study();
}
public class BepozWoowaTechCourse extends WoowaTechCourse {
@Override
public void study() {
System.out.println("토비의 스프링");
}
}
위의 코드와 같이 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
전체적으로 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
팩토리 메서드 패턴
public interface WoowaClass {
public void classOwner();
}
public class BrownClass implements WoowaClass{
@Override
public void classOwner() {
System.out.println("Brown 수업");
}
}
public class CuClass implements WoowaClass{
@Override
public void classOwner() {
System.out.println("CU 수업");
}
}
public class WoowaClassSelector {
public WoowaClass classSelect(String className) {
if ("CU".equals(className)) {
return new CuClass();
}
if ("Brown".equals(className)) {
return new BrownClass();
}
return null;
}
}
public void haveClass() {
WoowaClass woowaClass = new WoowaClassSelector().classSelect("CU");
woowaClass.classOwner();
}
팩토리 메서드 패턴이란 분기에 따른 객체의 생성을 직접 맡지않고, 팩토리라는 클래스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방법을 말한다. 상위 클래스에서 직접 객체를 생성하지 않으므로 의존성이 낮아진다.
추상 팩토리 패턴
public interface WoowaClassSelector {
WoowaClass classSelect();
}
public class BackEndClassSelector implements WoowaClassSelector {
@Override
public WoowaClass classSelect() {
return new CuClass();
}
}
public class FrontEndClassSelector implements WoowaClassSelector{
@Override
public WoowaClass classSelect() {
return new JunClass();
}
}
public class SelectorOfWoowaClassSelector {
public WoowaClass woowaClassSelect(String classType) {
WoowaClassSelector woowaClassSelector = null;
if ("BackEnd".equals(classType)) {
woowaClassSelector = new BackEndClassSelector();
}
if ("FrontEnd".equals(classType)) {
woowaClassSelector = new FrontEndClassSelector();
}
return woowaClassSelector.classSelect();
}
}
public void haveClass() {
WoowaClass woowaClass = new SelectorOfWoowaClassSelector().woowaClassSelect("BackEnd");
woowaClass.classOwner();
}
추상 팩토리 패턴은 팩토리 메서드 패턴과 굉장히 유사하다. 쉽게 비교해보면, 팩토리 메서드 패턴은 객체를 반환하는 팩토리를 생성해주는 것이고, 추상 팩토리 패턴은 그 팩토리들을 반환하는 팩토리의 팩토리를 만들어주는 것이라고 보면된다.
위의 코드에서는 백엔드, 프론트엔드 셀렉터를 셀렉트하는 셀렉터를 만들어주었는데 인터넷 상의 다른 예제들을 보면 동일하게 LG컴퓨터팩토리, 삼성컴퓨터팩토리를 정하는 팩토리의팩토리 코드 등이 있었다.
팩토리 메서드 패턴
- 조건에 따른 객체 생성을 팩토리 클래스로 위임하여, 팩토르 클래스에서 객체를 생성하는 패턴
추상 팩토리 패턴
- 서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴
Reference
https://beomseok95.tistory.com/243
https://victorydntmd.tistory.com/300
https://yaboong.github.io/design-pattern/2018/09/27/template-method-pattern/
'Java' 카테고리의 다른 글
[Java] OutputStream, InputStream, File 간단 사용법 정리 (0) | 2021.09.05 |
---|---|
[JDBC] 단일 Select을 위한 방법들 (0) | 2021.05.14 |
[Java] try-with-resources 에 대해 (0) | 2021.04.06 |
[Java] Arrays.asList와 List.of의 차이점에 대해 (0) | 2021.03.21 |
[Java] Stream의 distinct()와 sorted() 어느 것부터 먼저 해야할까?? (0) | 2021.03.14 |