Menu
Coddy logo textTech

Wzorzec Factory

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 91 z 110.

Wzorzec Fabryka deleguje tworzenie obiektów do osobnej metody lub klasy, pozwalając tworzyć obiekty bez określania ich dokładnej klasy. Różni się to od konstruktora fabrykującego, o którym uczyłeś się wcześniej — wzorzec Fabryka to podejście projektowe, w którym logika tworzenia jest scentralizowana i może zwracać różne typy w zależności od danych wejściowych.

Rozważ scenariusz, w którym musisz tworzyć różne typy powiadomień. Zamiast pozwalać klientowi decydować, którą klasę utworzyć, tę decyzję podejmuje fabryka:

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!
}

Kod klienta nie musi znać EmailNotification ani SMSNotification — po prostu prosi fabrykę o powiadomienie określonego typu. Dzięki temu łatwo dodawać nowe typy powiadomień: modyfikujesz tylko fabrykę, a nie każde miejsce, w którym tworzone są powiadomienia.

Użyj wzorca Factory, gdy tworzenie obiektów wymaga złożonej logiki, gdy chcesz ukryć klasy implementacyjne przed klientami lub gdy dokładny typ do utworzenia zależy od warunków w czasie wykonywania.

challenge icon

Wyzwanie

Łatwy

Zbudujmy generator dokumentów z użyciem wzorca Fabryka! Utworzysz system, który za pośrednictwem scentralizowanej fabryki tworzy różne rodzaje dokumentów (raporty, faktury i listy), dzięki czemu kod klienta nie musi znać konkretnych klas dokumentów.

Podzielisz kod na dwa pliki:

  • document_factory.dart: Utwórz tutaj system dokumentów:
    • Klasa abstrakcyjna Document z metodą generate(String content), która zwraca wartość typu String
    • Trzy konkretne klasy implementujące Document:
      • Report — jej metoda generate zwraca === REPORT ===\n[content]\n=============
      • Invoice — jej metoda generate zwraca INVOICE\n--------\n[content]\nTotal Due
      • Letter — jej metoda generate zwraca Dear Reader,\n[content]\nSincerely
    • Klasa DocumentFactory ze statyczną metodą create(String type), która zwraca odpowiedni obiekt Document na podstawie ciągu znaków określającego typ: "report", "invoice" lub "letter". Dla dowolnego nieznanego typu zwróć obiekt Letter jako wartość domyślną
  • main.dart: Zaimportuj fabrykę dokumentów i pokaż, jak fabryka tworzy różne rodzaje dokumentów, bez konieczności znajomości przez klienta konkretnych klas:
    • Użyj fabryki, aby utworzyć raport, a następnie wyświetl wynik jego wygenerowania z treścią Sales increased by 25%
    • Wyświetl pusty wiersz
    • Użyj fabryki, aby utworzyć fakturę, a następnie wyświetl wynik jej wygenerowania z treścią Widget x3 - $150
    • Wyświetl pusty wiersz
    • Użyj fabryki, aby utworzyć list, a następnie wyświetl wynik jego wygenerowania z treścią Thank you for your order

Zwróć uwagę, że główny plik korzysta wyłącznie z fabryki i abstrakcyjnego typu Document — nigdy bezpośrednio nie tworzy obiektów Report, Invoice ani Letter!

Oczekiwany wynik:

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

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

Dear Reader,
Thank you for your order
Sincerely

Spróbuj swoich sił

import 'document_factory.dart';

void main() {
  // TODO: Użyj DocumentFactory.create(), aby utworzyć raport
  // Następnie wypisz wynik jego wygenerowania z treścią: "Sales increased by 25%"
  
  // TODO: Wypisz pusty wiersz
  
  // TODO: Użyj DocumentFactory.create(), aby utworzyć fakturę
  // Następnie wypisz wynik jej wygenerowania z treścią: "Widget x3 - \$150"
  
  // TODO: Wypisz pusty wiersz
  
  // TODO: Użyj DocumentFactory.create(), aby utworzyć list
  // Następnie wypisz wynik jego wygenerowania z treścią: "Thank you for your order"
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online