디자인 패턴의 활용

[디자인 패턴의 활용] 팩토리 패턴

미로910 2024. 9. 26. 10:36
💡
1. 팩토리 패턴의 정의와 목적을 간단하게 설명할 수 있다.
2. 팩토리 패턴을 활용해 객체 생성 과정을 캡슐화할 수 있다.
3. 팩토리 패턴이 실무에서 활용되는 사례를 이해하고 예를 들어 설명할 수 있다.

 

사전 기반 지식

  • 객체 지향 프로그래밍: 클래스와 객체 생성에 대한 기본 개념.
  • 추상화: 구현과 인터페이스를 분리하는 개념.
  • 다형성: 상위 클래스나 인터페이스를 통해 다양한 하위 클래스를 처리하는 능력

 

팩토리 패턴이란(Factory Pattern)?

팩토리 패턴은 객체 생성 로직을 감추고, 클라이언트(사용자)가 어떤 객체를 생성할지 결정만 하면 내부적으로 그 객체를 생성하는 패턴입니다.

예를 들어 자판기는 다양한 음료를 제공하는데, 사용자가 음료를 선택하면 자판기가 내부에서 해당 음료를 준비해줍니다. 사용자는 음료가 준비되는 과정을 신경 쓸 필요 없이, 자판기에 요청만 하면 음료가 나오는 형태 입니다. 이것이 팩토리 패턴의 핵심입니다. 팩토리 패턴을 사용하면 객체 생성 과정이 클라이언트 코드로부터 분리되어, 클라이언트는 필요한 객체만 요청하고, 생성 과정은 팩토리(자판기)에서 처리됩니다.

package factory;

// 형성
/**
 * Character
 */
interface Character {
 void attack(); // 각 캐릭터의 공격 방식을 정의하는 메서드
}

// 전사 클래스
class Warrior implements Character{
    @Override
    public void attack() {
        System.out.println("전사가 칼로 공격합니다.");    
    }
}


// 마법사 클래스
class Mage implements Character{
    @Override
    public void attack() {
        System.out.println("마법사가 화염구를 발사합니다.");    
    }
}
// 궁수 클래스
class Archer implements Character{
    @Override
    public void attack() {
        System.out.println("궁수가 화살을 쏩니다.");    
    }
}


// 팩토리 클래스 - 구체적인 캐릭터 클래스를 생성하는 로직을 캡슐화 한다.
public class CharacterFactory {

    // 리턴 타입 : Character
    public Character createCharacter(String type){
        if(type.equalsIgnoreCase("warrior")){
            return new Warrior();
        }else if(type.equalsIgnoreCase("mage")){
            return new Mage();
        }else if(type.equalsIgnoreCase("archer")){
            return new Archer();
        }
        return null;
    } 

}
package factory;

import java.util.Scanner;;

// 팩토리 패턴을 사용하는 클라이언트 측 코드이다.
public class Game {
    
    public static void main(String[] args) {
        // 팩토리 클래스를 선언하여 캐릭터를 생성할 준비를 합니다.
        CharacterFactory characterFactory = new CharacterFactory();

        System.out.println("어떤 캐릭터를 선택하시겠습니까?");

        Scanner sc = new Scanner(System.in);
        String choice = sc.nextLine();
        //**
        // 팩토리 패턴을 사용하지 않으면, 클라이언트 측 입장에서 직접 if~else, switch 구문을 활용해서
        // 캐릭터 생성 로직을 직접 구현 해야 합니다.
        // 그러나 팩토리 클래스를 활용하면 객체 생성 로직을 팩토리 내부로 캡슐화 할 수 있습니다.

        Character 나의캐릭터 = characterFactory.createCharacter(choice);

        if (나의캐릭터 == null) {
            System.out.println("해당 캐릭터는 존재하지 않습니다.");
            return; // 실행에 제어권 반납
        }

        // 선택된 캐릭터가 공격을 수행합니다.
        나의캐릭터.attack();

    }

}
  팩토리 패턴을 사용하지 않으면, 클라이언트 측 입장에서 직접 if~else, switch 구문을 활용해서
  캐릭터 생성 로직을 직접 구현 해야 합니다.
  그러나 팩토리 클래스를 활용하면 객체 생성 로직을 팩토리 내부로 캡슐화 할 수 있습니다.

실행 결과________

 

활용 사례

팩토리 패턴은 다양한 곳에서 활용됩니다. 특히, 객체를 생성하는 로직이 복잡하거나 다양한 객체를 동적으로 생성해야 하는 경우 유용합니다.

데이터베이스 연결

  • 여러 데이터베이스(MySQL, PostgreSQL 등)를 선택적으로 사용할 때, 팩토리 패턴을 사용하면 코드에서 데이터베이스 종류에 상관없이 동일한 방식으로 연결을 처리할 수 있습니다. 데이터베이스 연결 로직을 팩토리에서 관리하므로 새로운 DB를 추가할 때 클라이언트 코드를 수정할 필요가 없습니다.

게임 개발

  • 게임에서 다양한 캐릭터나 무기, 아이템을 동적으로 생성해야 하는 경우 팩토리 패턴을 사용하면 객체 생성 과정을 일관되게 유지하고, 다형성을 적용할 수 있습니다. 새로운 캐릭터나 아이템을 추가할 때도 코드 변경이 최소화됩니다.

웹 애플리케이션

  • REST API나 MVC 패턴을 사용한 웹 애플리케이션에서는 클라이언트 요청에 따라 서로 다른 서비스 객체를 생성해야 할 경우가 많습니다. 이때 팩토리 패턴을 사용하면, 다양한 요청을 처리하는 객체를 유연하게 생성하고 관리할 수 있습니다.
  • 결제 처리 (카드 결제 서비스, 계좌 이체 등..)

 

핵심 요약

  • 팩토리 패턴은 객체 생성 로직을 캡슐화하여, 클라이언트가 구체적인 클래스에 의존하지 않고 다형성을 통해 객체를 사용할 수 있도록 도와줍니다.
  • 팩토리 패턴을 통해 프로그램은 더 유연하고, 객체 생성 방식이 변경되거나 확장되어도 클라이언트 코드에는 영향을 미치지 않습니다.

팩토리 패턴은 객체 생성 로직을 캡슐화하고, 다양한 객체를 동적으로 생성할 수 있도록 도와주는 중요한 디자인 패턴입니다.