Heim > Web-Frontend > js-Tutorial > Das abstrakte Fabrikmuster beherrschen: Ein umfassender Leitfaden

Das abstrakte Fabrikmuster beherrschen: Ein umfassender Leitfaden

Susan Sarandon
Freigeben: 2024-12-05 20:41:14
Original
906 Leute haben es durchsucht

Müssen Sie in Ihrer Anwendung mehrere Variationen verschiedener Objektfamilien erstellen, ohne die Logik immer wieder zu duplizieren?

Oder vielleicht haben Sie eine Anwendung erstellt, nur um dann festzustellen, dass neue Anforderungen oder geänderte Vorlieben eines Kunden völlig neue Objekte erfordern, was Sie dazu zwingt, Ihre gesamte Codebasis zu überarbeiten?

Was wäre, wenn es eine Möglichkeit gäbe, nahtlos neue Variationen einzuführen, ohne Ihren vorhandenen Code zu beschädigen, indem Sie einfach eine neue Implementierung einbinden?

Hier kommt das Designmuster Abstract Factory ins Spiel!

In diesem Tutorial werden wir dieses leistungsstarke Designmuster aufschlüsseln, indem wir eine Node.js-CLI-Anwendung zum Erstellen mehrerer Arten von Lebensläufen erstellen, die mehrere Formate und Themen unterstützen.

Überblick

Die Abstract Factory ist ein kreatives Designmuster, eine Kategorie von Designmustern, die sich mit den verschiedenen Problemen befasst, die mit der nativen Art der Objekterstellung mithilfe der neues Schlüsselwort oder Operator.

Sie können sich das

Abstrakte Fabrik-Entwurfsmuster als eine Verallgemeinerung des Fabrikmethoden-Entwurfsmusters vorstellen, das wir in diesem Blogartikel behandelt haben.

Problem

Das Designmuster

Abstract Factory löst die folgenden Probleme:

    Wie können wir
  1. Familien verwandter Produkte erstellen, wie zum Beispiel: PDFResume, JSONResume und MarkdownResume?
  2. Wie können wir mehrere Varianten pro Produktfamilie unterstützen, wie zum Beispiel:
  3. CreativeResume, MinimalistResume und ModernResume?
  4. Wie können wir das Hinzufügen weiterer Varianten und Produkte unterstützen, ohne unseren bestehenden Konsum- oder Clientcode zu beschädigen?
Lösung

Das Designmuster

Abstract Factory löst diese Probleme, indem es für jeden Produkttyp eine Schnittstelle oder abstrakte Klasse deklariert.

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Und dann erstellen wir, wie der Name des Musters schon sagt, eine

abstrakte Fabrik, eine Schnittstelle, die Fabrikmethoden deklariert, die jeden Produkttyp erstellen:

  • createPDFResume: Gibt einen PDFResume-Typ oder -Subtyp zurück.
  • createMarkdownResume: Gibt einen MarkdownResume-Typ oder -Subtyp zurück.
  • createJSONResume: Gibt einen JSONResume-Typ oder -Subtyp zurück.
export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Okay, jetzt haben wir eine generische Fabrik, die alle möglichen Produkttypen zurückgibt, aber wie können wir mehrere Varianten pro Produkt unterstützen?

Die Antwort besteht darin, eine ConcreteFactory zu erstellen, die die abstrakte Fabrik ( ResumeFactory ) implementiert.

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Um nun unsere Fabriken in unserer Client-Klasse zu nutzen, müssen wir nur noch eine Variable vom Typ ResumeFactory deklarieren und dann abhängig von der Benutzereingabe die entsprechende Betonfabrik instanziieren.

Kundencode:

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Struktur

Mastering the Abstract Factory Pattern: A Comprehensive Guide

Die Struktur des Abstract Factory-Entwurfsmusters besteht aus den folgenden Klassen:

  1. Factory: Der Grund für die Benennung dieses Entwurfsmusters abstrakte Fabrik ist, dass diese Klasse den Vertrag zwischen allen ConcreteFactories darstellt. Es definiert alle Factory-Methoden.
  • Die Anzahl der Fabrikmethoden entspricht der Anzahl der Produkte.
  • Jede Factory-Methode sollte einen abstrakten oder generischen Produkttyp zurückgeben ( IProduct{j} ).

In unserem Fall sind die in Factory deklarierten Factory-Methoden: createProductA und createProductB

  1. ConcreteFactory{i}: Diese Klassen implementieren die Klasse Factory und stellen benutzerdefinierte Implementierungen für jede Factory-Methode bereit.
  • Im obigen Schema ist i entweder gleich 1 oder 2.
  • Die Anzahl der ConcreteFactories entspricht der Anzahl der möglichen Varianten pro Produkt.
  • Jede konkrete Factory-Methode sollte ein Objekt zurückgeben, das eine Instanz des entsprechenden Produkts ist.
  1. IProduct{j}: Diese Klassen entsprechen den abstrakten Produkttypen.
  • Im obigen Schema ist j entweder gleich A oder B.
  • Jedes IProduct{j} wird durch viele konkrete Produktklassen implementiert.

ConcretProductA1 und ConcretProductA2 implementieren IProductA. ConcretProductB1 und ConcretProductB2 implementieren IProductB.

  1. ConcreteProducts sind die Produkte, die einen der IProduct{j} generischen Typen implementieren.

Praktisches Szenario

In diesem Abschnitt werden wir das vorherige Beispiel in die Tat umsetzen, indem wir eine voll funktionsfähige Node.js TypeScript CLI-Anwendung erstellen, die einen Lebenslauf basierend auf dem vom Benutzer gewählten Thema und Format erstellt.

Sie können sich gerne den vollständigen Arbeitscode ansehen, indem Sie dieses Repository auf Ihrem Computer klonen.

Führen Sie dann die folgenden Befehle aus:

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Typen deklarieren

Beginnen wir mit der Deklaration der Typen, die wir im gesamten Tutorial verwenden werden, um die Typsicherheit zu gewährleisten.

Schnittstellen/Typen

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  1. Der Typ ResumeData definiert alle Attribute eines Lebenslaufobjekts, wie z. B. Name, E-Mail, Telefonnummer und eine Reihe von Erfahrungen.
  2. Der Typ Erfahrung besteht aus: Unternehmen, Position, Startdatum, Enddatum und Beschreibung.

Erklärung unserer abstrakten Fabrik

Jetzt deklarieren wir den Typ generische Fabrik, der die drei Fabrikmethoden definiert, die den verschiedenen unterstützten Produkttypen entsprechen: PDFResume , MarkdownResume , und JSONResume.

Schnittstellen/ResumeFactory

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir werden ihren Code im nächsten Abschnitt durchgehen.

Deklarieren der gemeinsam genutzten Klasse für die verschiedenen Dokumenttypen

Als Nächstes beginnen wir mit der Erstellung unserer generischen Produktklassen.

Jeder Produkttyp wird eine abstrakte Klasse sein, da wir sowohl Attribute als auch Methoden zwischen den entsprechenden Untertypen teilen möchten.

  1. JSONResume: Die Klasse verfügt über ein geschütztes data-Attribut, das ein Objekt vom Typ ResumeData mit einem zusätzlichen Attribut namens style speichert.

Die Klasse definiert:

  • Eine Getter-Methode für den Zugriff auf das Attribut Daten.
  • Eine abstrakte generate-Methode, die später von den Unterklassen überschrieben wird.
  • Eine saveToFile-Methode mit einer grundlegenden Implementierung, die darin besteht, die Lebenslaufdaten in einer JSON-Datei zu speichern.

resumes/json/JSONResume

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das Schlüsselwort abstract bedeutet, dass die Klasse ein generischer Typ ist, der nicht instanziiert werden kann; Es kann nur von anderen Klassen geerbt werden.

  1. MarkdownResume: Die Klasse verfügt über ein geschütztes content-Attribut, das die Markdown-Zeichenfolge speichert.

Die Klasse definiert:

  • Eine Getter-Methode für den Zugriff auf das Attribut content.
  • Eine abstrakte generate-Methode, die später von den Unterklassen überschrieben wird.
  • Eine saveToFile-Methode, die einen Dateinamen annimmt und dann die Markdown-formatierte Zeichenfolge Inhalt in einer Datei speichert.

Lebensläufe/Markdown/MarkdownResume

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  1. PDFResume :

Die Klasse verfügt über ein geschütztes doc-Objekt vom Typ PDFKit.PDFDocument , das aus einer Bibliothek namens pdfkit importiert wird. Die Bibliothek vereinfacht das Erstellen und Bearbeiten von PDF-Dokumenten durch ihre objektorientierte Schnittstelle.

Die Klasse definiert:

  • Eine Getter-Methode für den Zugriff auf das Attribut doc.
  • Eine abstrakte generate-Methode, die später von den Unterklassen überschrieben wird.
  • Eine saveToFile-Methode, die das speicherinterne PDF-Objekt doc in einer bestimmten Datei speichert.

Lebensläufe/pdf/PDFResume

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Deklaration unserer Betonfabriken

Nachdem wir nun unsere generischen Produkttypen und unsere abstrakte Fabrik definiert haben, ist es an der Zeit, mit der Erstellung unserer ConcreteFactories fortzufahren, die dem entsprechen verschiedene Varianten jedes generischen Produkttyps.

Wir haben 3 mögliche Varianten für einen Lebenslauf: Kreativ, Minimalistisch und Modern. Und 3 Arten von generischen Produkten: JSON , PDF und Markdown.

Die abstrakte Fabrik ( ResumeFactory ) definiert die 3 Fabrikmethoden, die für die Erstellung unserer Produkte verantwortlich sind:

  • createPDFResume: Erstellt eine Instanz vom Typ PDFResume.
  • createMarkdownResume: Erstellt eine Instanz vom Typ MarkdownResume.
  • createJSONResume: Erstellt eine Instanz vom Typ JSONResume.

Um mehrere Varianten pro Produkt zu unterstützen, müssen wir drei Betonfabriken erstellen.

Jede Betonfabrik wird die drei Arten von Produkten herstellen, jedoch mit ihren eigenen Geschmacksrichtungen:

  1. CreativeResumeFactory erstellt Produkte der Creative-Variante.
  2. MinimalistResumeFactory erstellt Produkte der minimalistischen Variante.
  3. ModernResumeFactory erstellt Produkte der modernen Variante.

Fabriken/CreativeResumeFactory

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  • Die Factory-Methoden CreativeResumeFactory geben die kreative konkrete Produktvariante für jeden Produkttyp zurück.

Fabriken/MinimalistResumeFactory

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  • Die Fabrikmethoden MinimalistResumeFactory geben die minimalistische Betonproduktvariante für jeden Produkttyp zurück.

Fabriken/ModernResumeFactory

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  • Die Fabrikmethoden ModernResumeFactory geben die moderne Betonproduktvariante für jeden Produkttyp zurück.

Die Creative Resume Factory Betonprodukte

Jetzt erstellen wir die vorherigen ConcreteProducts, die von der CreativeResumeFactory

zurückgegeben werden

PDF-Lebenslauf :

resumes/pdf/CreativePDFResume

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Markdown-Lebenslauf :

Lebensläufe/Markdown/CreativeMarkdownResume

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

JSON-Lebenslauf :

resumes/json/CreativeJSONResume

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die minimalistische Lebenslauffabrik für Betonprodukte

Als nächstes erstellen wir die vorherigen ConcreteProducts, die von der MinimalistResumeFactory

zurückgegeben werden

PDF-Lebenslauf :

resumes/pdf/MinimalistPDFResume

npm install
npm start

Nach dem Login kopieren

Markdown-Lebenslauf :

Lebensläufe/Markdown/MinimalistMarkdownResume

export type ResumeData = {
  name: string
  email: string
  phone: string
  experience: Experience[]
}

export type Experience = {
  company: string
  position: string
  startDate: string
  endDate: string
  description: string
}

Nach dem Login kopieren

JSON-Lebenslauf :

resumes/json/MinimalistJSONResume

import { JSONResume } from "../resumes/json/JSONResume"
import { MarkdownResume } from "../resumes/markdown/MarkdownResume"
import { PDFResume } from "../resumes/pdf/PdfResume"

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Nach dem Login kopieren

Die moderne Lebenslauffabrik für Betonprodukte

Schließlich erstellen wir die vorherigen ConcreteProducts, die von der ModernResumeFactory

zurückgegeben werden

PDF-Lebenslauf :

resumes/pdf/ModernPDFResume

import * as fs from "fs/promises"

import { ResumeData } from "../../interfaces/Types"

export abstract class JSONResume {
  protected data!: ResumeData & { style: string }

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    await fs.writeFile(fileName, JSON.stringify(this.data, null, 2))
  }

  getData(): any {
    return this.data
  }
}

Nach dem Login kopieren

Markdown-Lebenslauf :

Lebensläufe/Markdown/ModernMarkdownResume

import * as fs from "fs/promises"

import { ResumeData } from "../../interfaces/Types"

export abstract class MarkdownResume {
  protected content: string = ""

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    await fs.writeFile(fileName, this.content)
  }

  getContent(): string {
    return this.content
  }
}

Nach dem Login kopieren

JSON-Lebenslauf :

resumes/json/ModernJSONResume

import * as fs from "fs"

import PDFDocument from "pdfkit"

import { ResumeData } from "../../interfaces/Types"

export abstract class PDFResume {
  protected doc: PDFKit.PDFDocument

  constructor() {
    this.doc = new PDFDocument()
  }

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    const stream = fs.createWriteStream(fileName)
    this.doc.pipe(stream)
    this.doc.end()

    await new Promise<void>((resolve, reject) => {
      stream.on("finish", resolve)
      stream.on("error", reject)
    })
  }

  getBuffer(): Buffer {
    return this.doc.read() as Buffer
  }
}

Nach dem Login kopieren

Verwendung unserer Fabriken in unserer Index.ts-Datei

Lassen Sie uns beginnen, die Früchte unserer bisherigen Arbeit zu tragen, indem wir unsere Fabriken im Kundencode verwenden.

Schauen Sie sich an, wie wir unsere Lebenslauf-Builder-Bibliothek jetzt auf sehr saubere Weise nutzen können, indem wir einfach unsere Fabriken nutzen.

Der Benutzer muss nur zwei Dinge angeben:

  1. Der Produkttyp: Welche Art von PDFs möchte er erstellen?
  2. Das Thema: Welche Lebenslaufstile bevorzugt er?

index.ts

import { ResumeFactory } from "../interfaces/ResumeFactory"
import { CreativeJSONResume } from "../resumes/json/CreativeJSONResume"
import { CreativeMarkdownResume } from "../resumes/markdown/CreativeMarkdownResume"
import { CreativePDFResume } from "../resumes/pdf/CreativePDFResume"

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume extends PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume extends MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume extends JSONResume
  }
}

Nach dem Login kopieren

Der obige Code funktioniert in drei Schritten:

  1. Benutzereingaben: Wir erhalten zuerst die Werte für Thema und Format.
  2. Auswahl einer Fabrik: Dann instanziieren wir die entsprechende Fabrik basierend auf dem Theme-Wert.
  3. Erstellung des Produkts: Abschließend rufen wir je nach gewähltem Format die entsprechende Factory-Methode auf.

Dem Benutzer ist es egal, wie Produkte und die entsprechenden Varianten erstellt werden; Sie müssen nur ein Thema und ein Format auswählen, und schon wird das entsprechende Produkt wie gewünscht erstellt.

Der Client-Code ist jetzt robust gegenüber Änderungen. Wenn wir ein neues Thema oder einen neuen Stil hinzufügen möchten, können wir einfach eine neue Fabrik erstellen, die dafür verantwortlich ist.

Wir haben die Kreidebibliothek verwendet, um unsere Terminalprotokolle entsprechend ihrer semantischen Bedeutung einzufärben.

Um die Eingaben vom Benutzer der CLI-App erhalten zu können, haben wir das Paket inquirer verwendet, das eine wirklich ansprechende und benutzerfreundliche Möglichkeit bietet, verschiedene Arten von Eingaben vom Benutzer zu erhalten.

  1. Die Funktion getUserInput wurde verwendet, um die wichtigsten Lebenslaufinformationen abzurufen: Name, E-Mail, Telefonnummer.
  2. Die Dienstprogrammfunktion getExperience wurde verwendet, um die Erfahrungsinformationen rekursiv vom Benutzer abzurufen. Mit anderen Worten: Es fordert den Benutzer auf, die Erlebnisinformationen für den ersten Eintrag einzugeben, und fragt dann, ob er ein weiteres Erlebnis hinzufügen möchte. Wenn die Antwort „Nein“ lautet, kehrt die Funktion einfach zurück. Wenn sie hingegen „Ja“ auswählen, werden sie erneut aufgefordert, die Informationen für das nächste Erlebnis einzugeben.

utils/userInput

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Abschluss

Das Abstract Factory-Muster ist ein leistungsstarkes Werkzeug im Arsenal von Softwaredesignern und -entwicklern. Es bietet einen strukturierten Ansatz zum Erstellen von Familien verwandter Objekte, ohne deren konkrete Klassen anzugeben. Dieses Muster ist besonders nützlich, wenn:

  1. Ein System sollte unabhängig davon sein, wie seine Produkte erstellt, zusammengesetzt und dargestellt werden.
  2. Ein System muss mit einer von mehreren Produktfamilien konfiguriert werden.
  3. Eine Familie verwandter Produktobjekte ist für die gemeinsame Verwendung konzipiert, und Sie müssen diese Einschränkung durchsetzen.
  4. Sie möchten eine Klassenbibliothek mit Produkten bereitstellen und nur deren Schnittstellen offenlegen, nicht deren Implementierungen.

In unserem praktischen Beispiel haben wir gesehen, wie das Abstract Factory-Muster angewendet werden kann, um ein flexibles und erweiterbares System zur Lebenslauferstellung zu erstellen. Dieses System kann problemlos neue Lebenslaufstile oder Ausgabeformate integrieren, ohne den vorhandenen Code zu ändern, und demonstriert so die Leistungsfähigkeit des Offen/Geschlossen-Prinzips in Aktion.

Obwohl das Abstract Factory-Muster viele Vorteile bietet, ist es wichtig zu beachten, dass es Ihrer Codebasis zusätzliche Komplexität verleihen kann. Daher ist es wichtig zu beurteilen, ob die dadurch gebotene Flexibilität für Ihren spezifischen Anwendungsfall erforderlich ist.

Durch die Beherrschung von Entwurfsmustern wie der Abstract Factory sind Sie besser für die Erstellung robuster, flexibler und wartbarer Softwaresysteme gerüstet. Erforschen Sie diese Muster weiter und wenden Sie sie in Ihren Projekten an, um Ihre Software-Designfähigkeiten zu verbessern.

Kontakt

Wenn Sie Fragen haben oder etwas weiter besprechen möchten, können Sie mich gerne hier kontaktieren.

Viel Spaß beim Codieren!

Das obige ist der detaillierte Inhalt vonDas abstrakte Fabrikmuster beherrschen: Ein umfassender Leitfaden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage