본문 바로가기
BackEnd

Engine 에서 구현되어야 할 팩토리 메서드(Factory Method) 패턴 ( 타입별로 객체 생성 방식 )

by 313devgrp 2023. 6. 29.

팩토리 메서드(Factory Method) 패턴은 객체 생성을 처리하기 위한 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성을 서브 클래스에 위임하여 객체 생성 과정을 캡슐화하는 방법을 제공합니다. 이를 통해 클라이언트 코드는 객체 생성의 구체적인 세부 사항에 대해 알 필요 없이 객체를 생성할 수 있습니다.

팩토리 메서드 패턴의 핵심 아이디어는 객체 생성을 처리하는 인터페이스를 정의하고, 이를 서브 클래스가 구현하는 것입니다. 이 인터페이스를 통해 객체 생성을 요청하면, 서브 클래스에서 실제적인 객체 생성과 초기화 과정을 수행합니다. 이를 통해 객체 생성의 세부 사항은 서브 클래스로 숨겨지고, 클라이언트 코드는 단순히 인터페이스를 사용하여 객체를 생성할 수 있습니다.

팩토리 메서드 패턴은 다음과 같은 장점을 가지고 있습니다.

  1. 유연성: 객체 생성을 위한 인터페이스를 정의함으로써, 클라이언트 코드는 구체적인 클래스에 의존하지 않고도 객체를 생성할 수 있습니다. 이는 새로운 클래스가 추가되거나 기존 클래스가 변경되더라도 클라이언트 코드를 수정할 필요 없이 객체 생성을 계속할 수 있는 유연성을 제공합니다.
  2. 확장성: 새로운 서브 클래스를 추가함으로써 객체 생성의 동작을 확장할 수 있습니다. 이는 다형성을 통해 구체적인 객체 생성 방법을 선택하는 장점을 제공합니다.
  3. 코드 중복 감소: 객체 생성 코드를 한 곳에 집중함으로써, 코드 중복을 감소시킬 수 있습니다. 객체 생성 로직이 여러 곳에 분산되는 것을 방지하여 코드의 유지보수성을 향상시킵니다.

팩토리 메서드 패턴은 객체 생성과 초기화에 대한 유연성과 확장성을 제공하여 객체지향 프로그래밍에서 자주 사용되는 패턴 중 하나입니다.

자바 코드로 팩토리 메서드 패턴의 예시를 보여드리겠습니다. 가정해보겠습니다. 우리는 게임을 개발하고 있으며, 여러 종류의 캐릭터를 생성해야 합니다. 각 캐릭터는 공격력을 가지고 있고, 이를 사용하여 공격을 수행할 수 있어야 합니다. 팩토리 메서드 패턴을 사용하여 캐릭터 객체를 생성하는 예시 코드는 다음과 같습니다.

 

먼저, 캐릭터를 나타내는 Character 인터페이스를 정의합니다:

public interface Character {
    void attack();
    int getAttackPower();
}

다음으로, 캐릭터를 생성하는 팩토리 클래스인 CharacterFactory를 만듭니다:

public class CharacterFactory {
    public Character createCharacter() {
        // 서브 클래스에서 구체적인 객체 생성 및 초기화를 수행
        Character character = createSpecificCharacter();
        
        // 공통적인 초기화 작업 수행
        character.attack();
        
        return character;
    }
    
    protected Character createSpecificCharacter() {
        // 서브 클래스에서 구체적인 객체 생성 및 반환
        return null;
    }
}

팩토리 클래스에서 createCharacter() 메서드는 객체를 생성하는 역할을 합니다. createSpecificCharacter() 메서드는 서브 클래스에서 구체적인 캐릭터 객체를 생성하고 반환하는 추상 메서드입니다. 이 추상 메서드는 서브 클래스에서 구현될 것입니다.

다음으로, Character 인터페이스를 구현하는 서브 클래스를 만듭니다. 예를 들어, Warrior와 Mage 클래스를 생성합니다

public class Warrior implements Character {
    private int attackPower;
    
    public Warrior(int attackPower) {
        this.attackPower = attackPower;
    }
    
    @Override
    public void attack() {
        System.out.println("Warrior attacks with power: " + attackPower);
    }
    
    @Override
    public int getAttackPower() {
        return attackPower;
    }
}

public class Mage implements Character {
    private int attackPower;
    
    public Mage(int attackPower) {
        this.attackPower = attackPower;
    }
    
    @Override
    public void attack() {
        System.out.println("Mage attacks with power: " + attackPower);
    }
    
    @Override
    public int getAttackPower() {
        return attackPower;
    }
}

마지막으로, 팩토리 메서드 패턴을 사용하여 캐릭터 객체를 생성하는 예시 코드를 작성합니다:

public class Main {
    public static void main(String[] args) {
        CharacterFactory factory = new CharacterFactory();
        
        // Warrior 객체 생성
        Character warrior = factory.createCharacter(new Warrior(100));
        System.out.println("Warrior's attack power: " + warrior.getAttackPower());
        
        // Mage 객체 생성
        Character mage = factory.createCharacter(new Mage(50));
        System.out.println("Mage's attack power: " + mage.getAttackPower());
    }
}