Menu
Coddy logo textTech

Fabrikmuster

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 91 von 110.

Das Factory pattern delegiert die Objekterstellung an eine separate Methode oder Klasse und ermöglicht es dir, Objekte zu erstellen, ohne ihre genaue Klasse anzugeben. Dies unterscheidet sich vom Factory-Konstruktor, den du zuvor kennengelernt hast – das Factory pattern ist ein Entwurfsansatz, bei dem die Erstellungslogik zentralisiert ist und abhängig von der Eingabe unterschiedliche Typen zurückgeben kann.

Stell dir ein Szenario vor, in dem du verschiedene Arten von Benachrichtigungen erstellen musst. Anstatt dass der Client entscheidet, welche Klasse instanziiert werden soll, übernimmt eine Factory diese Entscheidung:

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

Der Client-Code muss nichts über EmailNotification oder SMSNotification wissen – er bittet die Factory einfach um eine Benachrichtigung eines bestimmten Typs. Dadurch lassen sich neue Benachrichtigungstypen leicht hinzufügen: Du änderst nur die Factory, nicht jede Stelle, an der Benachrichtigungen erstellt werden.

Verwende das Factory-Muster, wenn die Objekterstellung komplexe Logik umfasst, wenn du Implementierungsklassen vor Clients verbergen möchtest oder wenn der genaue zu erstellende Typ von Laufzeitbedingungen abhängt.

challenge icon

Aufgabe

Einfach

Erstellen wir einen Dokumentgenerator mit dem Factory-Muster! Du erstellst ein System, das verschiedene Dokumenttypen (Berichte, Rechnungen und Briefe) über eine zentrale Factory erzeugt, sodass der Client-Code die spezifischen Dokumentklassen nicht kennen muss.

Du organisierst deinen Code in zwei Dateien:

  • document_factory.dart: Erstelle hier dein Dokumentensystem:
    • Eine abstrakte Klasse Document mit einer Methode generate(String content), die einen String zurückgibt
    • Drei konkrete Klassen, die Document implementieren:
      • Report – ihre generate-Methode gibt === REPORT ===\n[content]\n============= zurück
      • Invoice – ihre generate-Methode gibt INVOICE\n--------\n[content]\nTotal Due zurück
      • Letter – ihre generate-Methode gibt Dear Reader,\n[content]\nSincerely zurück
    • Eine Klasse DocumentFactory mit einer statischen Methode create(String type), die abhängig vom Typ-String Document, "report" oder "invoice" das passende "letter" zurückgibt. Für jeden unbekannten Typ soll standardmäßig ein Letter zurückgegeben werden
  • main.dart: Importiere deine Dokument-Factory und zeige, wie die Factory verschiedene Dokumenttypen erstellt, ohne dass der Client die konkreten Klassen kennen muss:
    • Verwende die Factory, um einen Bericht zu erstellen, und gib das Ergebnis seiner Generierung mit dem Inhalt Sales increased by 25% aus
    • Gib eine leere Zeile aus
    • Verwende die Factory, um eine Rechnung zu erstellen, und gib das Ergebnis ihrer Generierung mit dem Inhalt Widget x3 - $150 aus
    • Gib eine leere Zeile aus
    • Verwende die Factory, um einen Brief zu erstellen, und gib das Ergebnis seiner Generierung mit dem Inhalt Thank you for your order aus

Beachte, dass deine Hauptdatei nur mit der Factory und dem abstrakten Typ Document interagiert – sie erstellt niemals direkt Objekte von Report, Invoice oder Letter!

Erwartete Ausgabe:

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

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

Dear Reader,
Thank you for your order
Sincerely

Probier es selbst

import 'document_factory.dart';

void main() {
  // TODO: Verwende DocumentFactory.create(), um einen Bericht zu erstellen
  // Gib dann das Ergebnis der Generierung mit dem Inhalt "Sales increased by 25%" aus
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Verwende DocumentFactory.create(), um eine Rechnung zu erstellen
  // Gib dann das Ergebnis der Generierung mit dem Inhalt "Widget x3 - \$150" aus
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Verwende DocumentFactory.create(), um einen Brief zu erstellen
  // Gib dann das Ergebnis der Generierung mit dem Inhalt "Thank you for your order" aus
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler