# 팩토리 메소드 (Factory Method) 패턴

# 팩토리 메소드란 무엇인가요?

객체를 사용하는 코드에서 객체 생성 부분을 따로 분리하여 추상화하는 패턴입니다.
다시말해, 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴입니다.

# 예시 코드

  • 인터페이스 정의 : ex) 레벨이 있는 캐릭터를 만들것이다.
abstract class Character{
    public abstract int getLevel();

    public String toString() {
        return "This character's level is " + this.getLevel();
    }
}
  • 상위 클래스 : ex) 캐릭터의 타입에는 초보자, 마법사, 전사가 존재한다.
class Beginner extends Character {
    private int level;

    public Beginner() {
        this.level = 0;
    }

    @Override
    public int getLevel() {
        return this.level;
    }
}
class Wizard extends Character {
    private int level;

    public Wizard() {
        this.level = 0;
    }

    @Override
    public int getLevel() {
        return this.level;
    }
}
class Warrior extends Character {
    private int level;

    public Warrior(int level) {
        this.level = level;
    }

    @Override
    public int getLevel() {
        return this.level;
    }
}
  • 서브클래스 (팩토리 메소드) : ex) 주어진 타입에 맞는 캐릭터를 생성해서 반환해준다.
class CharacterFactory {
    public static Character getCharacter(String type, int level) {
        if ("wizard".equalsIgnoreCase(type)) return new Wizard(level);
        else if ("warrior".equalsIgnoreCase(type)) return new Warrior(level);
        else {
            return Beginner();
        }
    }
}
  • 팩토리 메소드를 이용하여 생성자를 호출하는 부분 : ex) 원하는 캐릭터를 만들기 위해 입력하는 부분.
public class Run {
    public static void main(String[] args) {
        Character wizard = CharacterFactory.getChampion("Wizard", 8); 
        Character warrior = CharacterFactory.getChampion("Warrior", 10);
    }
} 

# 팩토리 패턴의 장점은 무엇인가요?

  • 상위 클래스에서 인스턴스 생성 방식에 대해 알 필요가 없어 더 많은 유연성을 갖게 됩니다.
  • 객체 생성 로직이 따로 떼어져 있어, 리팩터링이 쉽고 유지 보수성이 증가됩니다.

# 팩토리 패턴의 단점은 무엇인가요?

  • 역할 분리로 인한 클래스의 양이 증가합니다. 따라서 보기에 복잡해집니다.

# 참고자료

출처: 주홍철.면접을 위한 CS 전공지식 노트.서울:길벗,2022.
출처: https://velog.io/@ljo_0920/%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C [juoh0920.log]