티스토리 뷰

Java

생성 패턴(팩토리 패턴)

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

 

 

팩토리 패턴이란
(Factory Pattern)

객체 생성 로직을 감추고, 클라이언트(사용자)가 어떤 객체를 생성할지 결정만 하면

내부적으로 그 객체를 생성하는 패턴

 

예를 들어, 자판기는 다양한 음료를 제공하는데, 사용자가 음료를 선택하면 자판기가 내부에서 해당 음료를 준비해줍니다.

 

사용자는 음료가 준비되는 과정을 신경 쓸 필요 없이, 자판기에 요청만 하면 음료가 나오는 형태 입니다.


이것이 팩토리 패턴의 핵심입니다.

 

팩토리 패턴을 사용하면 객체 생성 과정이 클라이언트 코드로부터 분리되어,

클라이언트는 필요한 객체만 요청하고, 생성 과정은 팩토리(자판기)에서 처리됩니다.

 

package factory;

// 다형성 

/**
 * InnerCharacterFactory
 */
 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();

    }
}

 

 

활용 사례

팩토리 패턴은 다양한 곳에서 활용됩니다.

특히, 객체를 생성하는 로직이 복잡하거나 다양한 객체를 동적으로 생성해야 하는 경우 유용합니다.

 

 

데이터베이스 연결

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

 

게임 개발

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

 

웹 애플리케이션

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

 

핵심 요약

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

 

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

 

 

'Java' 카테고리의 다른 글

행위 패턴(전략 패턴)  (0) 2024.09.27
구조 패턴(어댑터 패턴)  (3) 2024.09.26
생성 패턴(빌더 패턴)  (0) 2024.09.26
생성 패턴(싱글톤 패턴)  (0) 2024.09.26
S.O.L.I.D 원칙  (1) 2024.09.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함