Factory Method란, 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식이다.
상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식이라고 할 수 있다.
이제부터 언급할 프로젝트는 프로젝트에서 예외처리하기에서 나온 프로젝트와 동일합니다.
Factory Method 패턴을 적용할 곳은 관리자가 영상을 등록하는 곳이다.
현재 사용자에게 영상 타입 input을 받으면 그 input값에 따른 객체를 만들고 그 객체에 영상 정보를 저장하는 방식으로 구현했다.
아래는 그 예시 코드이다.
System.out.print("| 🫧 등록할 영상 타입 번호를 입력해주세요 : ");
int mediaType = input.nextInt();
if(mediaType < 1 || mediaType > 9) {
throw new InvalidInputException();
}
switch(mediaType) {
case 1:
makeMedia();
break;
case 2:
makeEntertainment();
break;
case 3:
makeDrama();
break;
case 4:
makeCrimeDrama();
break;
case 5:
makeRomanticDrama();
break;
case 6:
makeHistoricalDrama();
break;
case 7:
makeMovie();
break;
case 8:
makeSadMovie();
break;
case 9:
makeActionMovie();
break;
}
이런식으로 사용자에게 입력을 받으면 switch문을 통해 타입별로 실행할 함수를 지정해주었다.
makeMedia(), makeEntertainment(), makeDrama(), makeCrimeDrama() ... 는 각자 생성하는 인스턴스만 다를 뿐 로직은 똑같다.
이러한 유사성이 있기 때문에 인터페이스를 사용하여 MediaFactory를 만들고 이를 구현한 EntertainmentFactory, DramaFactory, .. 을 추가하여 Factory Method 패턴을 한번 사용해보자.
makeMedia, makeEntertainment 등등은 똑같이 객체를 만들어 반환하기 때문에 MediaFactory interface를 만들어 공통 역할을 하는 method를 선언한다.
package com.ass6.mediaFactory;
import com.ass6.media.Media;
import java.util.Scanner;
public interface MediaFactory {
Media createMedia(Scanner input);
}
그리고 MediaFactory를 implement한 DramaFactory, CrimeDramaFactory, 등등을 아래의 코드와 비슷하게 객체를 생성할 수 있도록 mthod를 override한다.
package com.ass6.mediaFactory;
import com.ass6.media.Media;
import com.ass6.media.Movie;
import java.util.Scanner;
public class MovieFactory implements MediaFactory{
@Override
public Media createMedia(Scanner input) {
System.out.println("| 📢 일반 영화를 등록합니다.");
System.out.print("| 🫧 제목을 입력해주세요: ");
String title = input.nextLine();
System.out.print("| 🫧 영상 시간을 입력해주세요 (단위: 분) : ");
int duration = input.nextInt();
System.out.print("| 🫧 관객수를 입력해주세요: ");
int view = input.nextInt();
System.out.print("| 🫧 현재 상영 여부를 입력해주세요( true, false ): ");
boolean release = input.nextBoolean();
return new Movie(title, duration, view, release);
}
}
Factory가 다 구현이 완료되었다면, 위에서 switch(mediaType)부분을 변경할 차례이다.
int mediaType = getUserInput("| 🫧 등록할 영상 타입 번호를 입력해주세요 : ", 1, 9);
switch (mediaType) {
case 1 -> addMediaFactory(new MediaFactoryImpl());
case 2 -> addMediaFactory(new EntertainmentFactory());
case 3 -> addMediaFactory(new DramaFactory());
case 4 -> addMediaFactory(new CrimeDramaFactory());
case 5 -> addMediaFactory(new RomanticDramaFactory());
case 6 -> addMediaFactory(new HistoricalDramaFactory());
case 7 -> addMediaFactory(new MovieFactory());
case 8 -> addMediaFactory(new SadMovieFactory());
case 9 -> addMediaFactory(new ActionMovieFactory());
}
이렇게 변경을 한다면 factory method 패턴을 적용을 한 것이라고 볼 수 있다.