사전 기반 지식
- 객체 지향 프로그래밍 : 클래스와 객체 생성에 대한 기본 개념.
- 추상화 : 구현과 인터페이스를 분리하는 개념.
- 다형성 : 상위 클래스나 인터페이스를 통해 다양한 하위 클래스를 처리하는 능력
팩토리 패턴
팩토리 패턴은 객체 생성 로직을 감추고, 클라이언트(사용자)가 어떤 객체를 생성할지 결정만 하면 내부적으로 그 객체를 생성하는 패턴이다. 예를 들어 자판기는 다양한 음료를 제공하는데, 사용자가 음료를 선택하면 자판기가 내부에서 해당 음료를 준비해준다. 사용자는 음료가 준비되는 과정을 신경 쓸 필요 없이, 자판기에 요청만 하면 음료가 나오는 형태이다.
이것이 팩토리 패턴의 핵심이다. 팩토리 패턴을 사용하면 객체 생성 과정이 클라이언트 코드로부터 분리되어, 클라이언트는 필요한 객체만 요청하고, 생성 과정은 팩토리(자판기)에서 처리된다.
package factory;
/**
* InnerCharacterFactory
*/
interface Character {
void attack(); // 각 캐릭터의 공격 방식을 정의하는 메서드
}
// 전사 클래스
class Warrior implements Character {
@Override
public void attack() {
System.out.println("전사가 칼로 공격합니다.");
}
}
// 마법사 클래스
class Magic 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("magic")) {
return new Magic();
}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.26 |
|---|---|
| 어댑터 패턴 (2) | 2024.09.26 |
| 빌더 패턴 (0) | 2024.09.26 |
| 디자인 패턴의 활용 (0) | 2024.09.26 |
| S.O.L.I.D 원칙 (1) | 2024.09.25 |