사전 기반 지식
- 객체 지향 프로그래밍: 클래스와 객체 생성에 대한 기본 개념.
- 추상화: 구현과 인터페이스를 분리하는 개념.
- 다형성: 상위 클래스나 인터페이스를 통해 다양한 하위 클래스를 처리하는 능력
팩토리 패턴이란(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 패턴을 사용한 웹 애플리케이션에서는 클라이언트 요청에 따라 서로 다른 서비스 객체를 생성해야 할 경우가 많습니다. 이때 팩토리 패턴을 사용하면, 다양한 요청을 처리하는 객체를 유연하게 생성하고 관리할 수 있습니다.
- 결제 처리 (카드 결제 서비스, 계좌 이체 등..)
핵심 요약
- 팩토리 패턴은 객체 생성 로직을 캡슐화하여, 클라이언트가 구체적인 클래스에 의존하지 않고 다형성을 통해 객체를 사용할 수 있도록 도와줍니다.
- 팩토리 패턴을 통해 프로그램은 더 유연하고, 객체 생성 방식이 변경되거나 확장되어도 클라이언트 코드에는 영향을 미치지 않습니다.
팩토리 패턴은 객체 생성 로직을 캡슐화하고, 다양한 객체를 동적으로 생성할 수 있도록 도와주는 중요한 디자인 패턴입니다.
'Spring boot > 개념 공부' 카테고리의 다른 글
전략 패턴 (1) | 2024.09.27 |
---|---|
어댑터 패턴 (2) | 2024.09.27 |
빌더 패턴이란? (0) | 2024.09.27 |
싱글 톤 패턴 (2) | 2024.09.27 |
콜백 메서드 만들어 보기 (1) (0) | 2024.09.27 |