Menu
Coddy logo textTech

팩토리 패턴

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 91번째.

팩토리 패턴(Factory pattern)은 객체 생성을 별도의 메서드나 클래스에 위임하여, 정확한 클래스를 지정하지 않고도 객체를 생성할 수 있게 해줍니다. 이는 이전에 배운 팩토리 생성자(factory constructor)와는 다릅니다. 팩토리 패턴은 생성 로직이 중앙 집중화되어 입력에 따라 서로 다른 유형을 반환할 수 있는 디자인 접근 방식입니다.

다양한 유형의 알림을 생성해야 하는 시나리오를 생각해 보세요. 클라이언트가 어떤 클래스를 인스턴스화할지 결정하는 대신, 팩토리가 그 결정을 처리합니다:

abstract class Notification {
  void send(String message);
}

class EmailNotification implements Notification {
  @override
  void send(String message) => print('Email: $message');
}

class SMSNotification implements Notification {
  @override
  void send(String message) => print('SMS: $message');
}

class NotificationFactory {
  static Notification create(String type) {
    switch (type) {
      case 'email':
        return EmailNotification();
      case 'sms':
        return SMSNotification();
      default:
        return EmailNotification();
    }
  }
}

void main() {
  var notification = NotificationFactory.create('sms');
  notification.send('Hello!');  // SMS: Hello!
}

클라이언트 코드는 EmailNotification 또는 SMSNotification에 대해 알 필요가 없습니다. 단지 팩토리에 특정 유형의 알림을 요청할 뿐입니다. 이는 새로운 알림 유형을 추가하는 것을 쉽게 만듭니다. 알림을 생성하는 모든 곳을 수정할 필요 없이 팩토리만 수정하면 됩니다.

객체 생성이 복잡한 로직을 포함하거나, 클라이언트로부터 구현 클래스를 숨기고 싶을 때, 또는 생성할 정확한 타입이 런타임 조건에 따라 달라지는 경우 Factory 패턴을 사용하세요.

challenge icon

챌린지

쉬움

팩토리 패턴을 사용하여 문서 생성기를 만들어 봅시다! 클라이언트 코드가 구체적인 문서 클래스에 대해 알 필요가 없도록, 중앙 집중식 팩토리를 통해 다양한 유형의 문서(보고서, 송장, 편지)를 생성하는 시스템을 만들 것입니다.

코드를 두 개의 파일로 구성합니다:

  • document_factory.dart: 여기에 문서 시스템을 만듭니다:
    • String을 반환하는 generate(String content) 메서드를 가진 추상 클래스 Document
    • Document를 구현하는 세 개의 구체 클래스:
      • Report - generate 메서드는 === REPORT ===\n[content]\n=============를 반환합니다.
      • Invoice - generate 메서드는 INVOICE\n--------\n[content]\nTotal Due를 반환합니다.
      • Letter - generate 메서드는 Dear Reader,\n[content]\nSincerely를 반환합니다.
    • 타입 문자열 "report", "invoice", 또는 "letter"에 따라 적절한 Document를 반환하는 정적 메서드 create(String type)를 가진 DocumentFactory 클래스. 알 수 없는 타입의 경우 기본값으로 Letter를 반환합니다.
  • main.dart: 문서 팩토리를 임포트하고, 클라이언트가 구체 클래스를 알 필요 없이 팩토리가 어떻게 다양한 문서 유형을 생성하는지 보여줍니다:
    • 팩토리를 사용하여 보고서를 생성하고, Sales increased by 25%라는 내용으로 생성된 결과를 출력합니다.
    • 빈 줄을 출력합니다.
    • 팩토리를 사용하여 송장을 생성하고, Widget x3 - $150라는 내용으로 생성된 결과를 출력합니다.
    • 빈 줄을 출력합니다.
    • 팩토리를 사용하여 편지를 생성하고, Thank you for your order라는 내용으로 생성된 결과를 출력합니다.

메인 파일이 오직 팩토리와 추상 Document 타입하고만 상호작용하며, Report, Invoice, 또는 Letter 객체를 직접 생성하지 않는다는 점에 주목하세요!

예상 출력:

=== REPORT ===
Sales increased by 25%
=============

INVOICE
--------
Widget x3 - $150
Total Due

Dear Reader,
Thank you for your order
Sincerely

치트 시트

팩토리 패턴(Factory pattern)은 객체 생성을 별도의 메서드나 클래스에 위임하여, 정확한 클래스를 지정하지 않고도 객체를 생성할 수 있게 합니다. 생성 로직은 중앙 집중화되며 입력에 따라 다른 타입을 반환할 수 있습니다.

팩토리 패턴의 기본 구조:

abstract class Notification {
  void send(String message);
}

class EmailNotification implements Notification {
  @override
  void send(String message) => print('Email: $message');
}

class SMSNotification implements Notification {
  @override
  void send(String message) => print('SMS: $message');
}

class NotificationFactory {
  static Notification create(String type) {
    switch (type) {
      case 'email':
        return EmailNotification();
      case 'sms':
        return SMSNotification();
      default:
        return EmailNotification();
    }
  }
}

void main() {
  var notification = NotificationFactory.create('sms');
  notification.send('Hello!');  // SMS: Hello!
}

클라이언트 코드는 구체적인 구현 클래스가 아닌 팩토리 및 추상 타입과만 상호작용합니다. 이는 새로운 타입을 추가하는 것을 쉽게 만들어 줍니다. 오직 팩토리만 수정하면 되기 때문입니다.

다음과 같은 경우에 팩토리 패턴을 사용하세요:

  • 객체 생성에 복잡한 로직이 포함될 때
  • 클라이언트로부터 구현 클래스를 숨기고 싶을 때
  • 생성할 정확한 타입이 런타임 조건에 따라 달라질 때

직접 해보기

import 'document_factory.dart';

void main() {
  // TODO: DocumentFactory.create()를 사용하여 보고서(report) 생성하기
  // 그 다음 "Sales increased by 25%" 내용을 포함하여 생성된 결과를 출력하기
  
  // TODO: 빈 줄 출력하기
  
  // TODO: DocumentFactory.create()를 사용하여 송장(invoice) 생성하기
  // 그 다음 "Widget x3 - \$150" 내용을 포함하여 생성된 결과를 출력하기
  
  // TODO: 빈 줄 출력하기
  
  // TODO: DocumentFactory.create()를 사용하여 편지(letter) 생성하기
  // 그 다음 "Thank you for your order" 내용을 포함하여 생성된 결과를 출력하기
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨