본문 바로가기

Java/디자인 패턴의 활용

팩토리 패턴

사전 기반 지식

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

 

 

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

팩토리 패턴은 객체 생성 로직을 감추고, 클라이언트(사용자)가 어떤 객체를 생성할지 결정만 하면 내부적으로 그 객체를 생성하는 패턴이다. 예를 들어 자판기는 다양한 음료를 제공하는데, 사용자가 음료를 선택하면 자판기가 내부에서 해당 음료를 준비해준다. 사용자는 음료가 준비되는 과정을 신경 쓸 필요 없이, 자판기에 요청만 하면 음료가 나오는 형태이다.


이것이 팩토리 패턴의 핵심이다. 팩토리 패턴을 사용하면 객체 생성 과정이 클라이언트 코드로부터 분리되어, 클라이언트는 필요한 객체만 요청하고, 생성 과정은 팩토리(자판기)에서 처리된다.

package factory;

// 다형성
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 creatCharacter(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.creatCharacter(choice);
        if(나의캐릭터 == null){
            System.out.println("해당 캐릭터는 존재하지 않습니다.");
            return; // 실행의 제어권 반납
        }

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

    }

}

 

 

활용 사례

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

 

데이터베이스 연결

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

게임 개발

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

웹 애플리케이션

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

 

 

핵심 요약

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

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

728x90

'Java > 디자인 패턴의 활용' 카테고리의 다른 글

어댑터 패턴  (1) 2024.09.26
빌더 패턴이란?  (0) 2024.09.26
싱글 톤 패턴  (1) 2024.09.25
콜백 메서드 만들어보기  (0) 2024.09.25
디자인 패턴의 활용  (2) 2024.09.25