본문 바로가기
디자인패턴

Factory Method 패턴

by 갈잃자 2025. 9. 9.

보통 객체를 만들때 이런 방식으로 객체가 만들어짐

const btn = new PrimaryButton();

 

위와같은 객체가 늘어나면, 단점이 여러가지가 생김

  • 객체 종류가 늘어나면 new 가 많아져서 코드 유지보수가 어려움
  • 클라이언트 코드와 구체 클래스가 강하게 결합되어 확장성이 떨어짐
  • API, 버튼 등이 늘어나면 코드가 지저분해짐

Factory Method는 객체 생성 로직을 한군데 모아두고, 확장성 있게, 수정에 닫혀있게 만드는게 핵심

 

프론트에선

  • 컴포넌트 생성
  • API 클라이언트

백엔드에선

  • DB 연결 객체
  • 결제 모듈(카드, 카카오)

등에서 사용된다.


구현방식

 

1. 인터페이스 정의

// 인터페이스 정의
interface Button {
  render(): void;
}

 

2. 구체화 클래스들

// 구체화 클래스들
class PrimaryButton implements Button {
  render() { console.log("Primary Button"); }
}

class DangerButton implements Button {
  render() { console.log("Danger Button"); }
}

 

3. Factory Method

// Factory Method
class ButtonFactory {
  static create(type: "primary" | "danger"): Button {
    if (type === "primary") return new PrimaryButton();
    if (type === "danger") return new DangerButton();
    throw new Error("Unknown button type");
  }
}

 

4. 클라이언트 코드에서 사용

// 클라이언트 코드에서 사용
const btn1 = ButtonFactory.create("primary");
btn1.render(); // "Primary Button"

const btn2 = ButtonFactory.create("danger");
btn2.render(); // "Danger Button"

 

해당 디자인 패턴은 확장성에 가장 포커스를 둔 코드이므로 확장 시킬때 편리함 + 가독성을 확인하기 위해 SuccessButton을 추가해보자

 

class PrimaryButton implements Button {
  render() { console.log("Primary Button"); }
}

class DangerButton implements Button {
  render() { console.log("Danger Button"); }
}

// 추가
class SuccessButton implements Button {
  render() { console.log("Success Button"); }
}

 

// Success button 추가
class ButtonFactory {
  static create(type: "primary" | "danger" | "success"): Button {
    if (type === "primary") return new PrimaryButton();
    if (type === "danger") return new DangerButton();
    if (type === "success") return new SuccessButton();
    throw new Error("Unknown button type");
  }
}

 

'디자인패턴' 카테고리의 다른 글

Prototype 패턴  (0) 2025.09.12
Builder 패턴  (0) 2025.09.09
Abstract Factory (추상 팩토리 패턴)  (0) 2025.09.09
singleton(싱글턴) 패턴  (0) 2025.09.05

댓글