Evgenii Legotckoi
Evgenii Legotckoi13. September 2018 06:01

Generative Designmuster - Abstrakte Fabrik

Die Gründe

  • Bereitstellen einer Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne ihre spezifischen Klassen anzugeben.
  • Hierarchie, die einschließt: viele mögliche "Plattformen" und Aufbau einer Reihe von "Produkten".
  • Der neue Operator gilt als schädlich.

Probleme

Wenn eine Anwendung portabel sein soll, muss sie alle Abhängigkeiten der Zielplattform kapseln. Diese "Plattformen" können umfassen: Fenstersystem, Betriebssystem, Datenbank usw. Allzu oft wird diese Kapselung nicht im Voraus entworfen, und viele case -Anweisungen oder verschiedene #ifdef mit Optionen für alle derzeit unterstützten Plattformen fangen an, sich wie Kaninchen im gesamten Code zu vermehren.

Diskussion

Bereitstellen einer Abstraktionsschicht, die die Erstellung von Familien verwandter oder abhängiger Objekte abstrahiert, ohne ihre konkreten Klassen explizit anzugeben. Das Factory-Objekt ist für die Bereitstellung von Diensten zum Erstellen der gesamten Klassenfamilie auf allen unterstützten Plattformen verantwortlich. Clients erstellen Plattformobjekte niemals direkt, sie bitten die Factory, dies für sie zu tun.

Dieser Mechanismus macht es einfach, die Familie der abgeleiteten Klassenobjekte zu ändern, da eine bestimmte Factory-Objektklasse nur einmal in der Anwendung erscheint, wo sie erstellt wird. Eine Anwendung kann die Möglichkeit bieten, eine ganze Familie abgeleiteter Objekte zu modifizieren, indem sie einfach eine andere spezifische Instanz der abstrakten Fabrik instanziiert.

Da der vom Factory-Objekt bereitgestellte Dienst so verbreitet ist, wird er normalerweise als Singleton implementiert. Oder es kann im Fall der Programmiersprache C++ unter Verwendung statischer Klassenmethoden implementiert werden.

Struktur

Eine abstrakte Factory definiert eine Factory-Methode für jedes generierte Objekt. Jede Factory-Methode kapselt den neuen Operator und konkrete, plattformspezifische Klassen. Jede "Plattform" wird dann durch eine abgeleitete Factory-Klasse modelliert.

Beispiel

Der Zweck von Abstract Factory besteht darin, eine Schnittstelle zum Erstellen von Familien verwandter Objekte bereitzustellen, ohne konkrete Klassen anzugeben. Dieses Modell ist in Blechstanzanlagen zu finden, die bei der Herstellung von Automobilen verwendet werden. Stanzausrüstung ist eine abstrakte Fabrik, die Autoteile herstellt. Derselbe Mechanismus wird verwendet, um rechte Seitentüren, linke Türen, rechte vordere Kotflügel, linke vordere Kotflügel, Motorhauben usw. für verschiedene Automodelle zu stanzen. Durch die Verwendung von Rollen zum Wechseln der Prägemuster können die von der Maschine produzierten spezifischen Qualitäten innerhalb von Minuten geändert werden.

Kontrollliste

  • Entscheiden Sie, ob "Plattformunabhängigkeit" und Autorendienste Probleme in Ihrem Code verursachen.
  • Leiten Sie eine Matrix von „Plattformen“ und „Produkten“ ab. Für welche Plattform, welche Klassen werden benötigt.
  • Definieren Sie eine Factory-Schnittstelle, die aus einer Factory-Methode für jedes hervorgebrachte Objekt besteht.
  • Definieren Sie für jede Plattform eine Produktionsklasse, die alle Verweise auf den neuen Operator kapselt.
  • Der Client muss alle Verweise auf new entfernen und Factory-Methoden verwenden, um untergeordnete Objekte zu erstellen.

Faustregeln

  • Manchmal konkurrieren übergeordnete Templates: Es gibt Zeiten, in denen entweder das Prototype-Template oder das Abstract Factory-Template erfolgreich verwendet werden können. Ansonsten ergänzen sie sich gegenseitig: Eine Abstract Factory kann eine Reihe von Prototypen speichern, aus denen Objekte geklont und zurückgegeben werden können. Der Builder kann eine der anderen Vorlagen verwenden, um die zu erstellenden Komponenten zu implementieren. Abstract Factory, Builder und Prototype können Singleton in ihrer Implementierung verwenden.
  • Abstract Factory, Builder und Prototype definieren ein Factory-Objekt, das für die Erstellung einer Klasse von generierten Objekten verantwortlich ist, und machen es zu einem Systemparameter. Eine abstrakte Factory hat ein Factory-Objekt oder eine Methode, die Objekte mehrerer Klassen erzeugt. Der Erbauer hat ein Fabrikobjekt, das ein komplexes Produkt inkrementell unter Verwendung eines geeigneten komplexen Protokolls aufbaut. Ein Prototyp hat ein Fabrikobjekt (auch bekannt als Prototyp), das ein Produkt erstellt, indem es das Prototypobjekt kopiert.
  • Abstrakte Factory-Klassen werden oft mit Factory-Methoden implementiert, sie können aber auch mit Prototype implementiert werden.
  • Abstract Factory kann als Alternative zu Facade verwendet werden, um plattformspezifische Klassen auszublenden.
  • Builder konzentriert sich darauf, ein komplexes Objekt Schritt für Schritt zu erstellen. Die abstrakte Fabrik betont eine Familie von Produktobjekten (einfach oder komplex). Der Builder gibt das Produkt als letzten Schritt zurück, aber was die abstrakte Fabrik betrifft, kehrt das Produkt sofort zurück.
  • Oft beginnen Projekte mit der Factory-Methode (weniger komplex, anpassbar, Unterklassen nehmen zu) und entwickeln sich in Richtung Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Entwickler feststellt, dass beim Erstellen eines Objekts mehr Flexibilität erforderlich ist.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 14:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 18:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr9. Februar 2024 02:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 18:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 10:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 22:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 16:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 11:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken