# 팩토리 메소드 (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]