Factory Method Pattern

2023. 4. 12. 21:22·📚 Data Architect/Design Pattern

💡 Factory Method Pattern

Factory Method Pattern을 사용하는 이유

  • 객체 간 결합도 ↓ (유지보수성 증가, 불필요한 클래스 의존성 제거)
  • 객체의 생성 처리를 서브 클래스로 분리&처리하도록 캡슐화 하는 패턴
  • 특정 조건에 따라 객체를 다르게 생성해야 할 경우
  • 서브 클래스(팩토리 클래스)에 객체 생성 위임

객체 간 결합도란?
클래스에 변경이 생겼을때 다른 클래스에 미치는 영향 (의존성)


Factory Method Pattern을 사용하지 않는 경우

  • 팩토리 메서드 패턴을 사용하지 않는 아래 코드의 문제점
    • 중복 코드의 발생
    • 객체 간 결합도 ↑
/* ----------------팩토리 메서드 사용 X--------------- */

// abstract 클래스를 정의하여 캡슐화
public abstract class Source {

}

public class ProcessA extends Source {
    public A() {
        System.out.println("Process A 생성");
    }
}

public class ProcessB extends Source {
    public B() {
        System.out.println("Process B 생성");
    }
}

public class ProcessC extends Source {
    public C() {
        System.out.println("Process C 생성");
    }
}

// 문자열에 따른 클래스 생성의 분기 처리
public class NotFactory {
    public Source create(String source) {
        Source returnSource = null;

        switch (source) {
            case "A": returnSource = new ProcessA();
            case "B": returnSource = new ProcessB();
            case "C": returnSource = new ProcessC();
        }
    }
}

public class Client {
    public static void main(String[] args) {
        NotFactory non = new NotFactory();
        non.create("A");
        non.create("B");
    }
}

Factory Method Pattern 사용

  • 팩토리 메서드를 사용함으로 얻는 장점은 본문 상단에 명시함
/* ----------------팩토리 메서드 사용 --------------- */

// 리팩터링 포인트 1. 팩토리 메서드로 객체 생성 위임
public class Factory {
    public Source create(String source) {
        Source returnSource = null;

        switch (source) {
            case "A": returnSource = new ProcessA(); break;
            case "B": returnSource = new ProcessB(); break;
            case "C": returnSource = new ProcessC(); break;
        }
        return returnSource;
    }
}

public class ProcessA extends Source {
    public A() {
        System.out.println("Process A 생성");
    }
}

public class ProcessB extends Source {
    public B() {
        System.out.println("Process B 생성");
    }
}

public class ProcessC extends Source {
    public C() {
        System.out.println("Process C 생성");
    }
}

// 리팩터링 포인트 2. 팩토리 메서드에서 생성한 객체 리턴
public class UseFactory {
    public Source create(String source) {
        Factory factory = new Factory();
        Source returnSource = factory.create(source);

        return returnSource;
    }
}

public class Client {
    public static void main(String[] args) {
        UseFactory use = new NotFactory();
        use.create("A");
        use.create("B");
    }
}
저작자표시 (새창열림)

'📚 Data Architect > Design Pattern' 카테고리의 다른 글

CQRS(Command Query Responsibility Segregation) Pattern  (0) 2024.11.26
Static Factory Method Pattern  (0) 2023.04.12
Builder Pattern  (0) 2023.04.12
'📚 Data Architect/Design Pattern' 카테고리의 다른 글
  • CQRS(Command Query Responsibility Segregation) Pattern
  • Static Factory Method Pattern
  • Builder Pattern
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      GStreamer #Pipeline
      Lock #Thread #Concurrency
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Factory Method Pattern
    상단으로

    티스토리툴바