[Java] interface를 사용해 Factory Method 패턴 적용해보기

YTT.erica·2024년 5월 22일

Factory Method란,

Factory Method란, 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식이다.

상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식이라고 할 수 있다.

프로젝트 상황

이제부터 언급할 프로젝트는 프로젝트에서 예외처리하기에서 나온 프로젝트와 동일합니다.

Factory Method 패턴을 적용할 곳은 관리자가 영상을 등록하는 곳이다.
현재 사용자에게 영상 타입 input을 받으면 그 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 패턴을 적용을 한 것이라고 볼 수 있다.

profile
'◡'✿ 꿈을 찾아가보자고~ '◡'✿

0개의 댓글