Evgenii Legotckoi
Evgenii Legotckoi17. September 2018 05:37

Generative Entwurfsmuster - Fabrikmethode

Ziele

  • Wir definieren eine Schnittstelle zum Erstellen eines Objekts, lassen aber die Unterklassen entscheiden, welche Klasse erstellt werden soll. Mit einer Factory-Methode können Sie eine Klasse für Unterklassen instanziieren.
  • Definition eines "virtuellen" Konstruktors.
  • Der neue Operator ist schädlich.

Probleme

Die Entwurfsstruktur sollte das Architekturmodell über eine Reihe von Anwendungen hinweg standardisieren, ermöglicht es jedoch einzelnen Anwendungen, ihre eigenen Objekte zu definieren und ihre eigenen Regeln zum Erstellen von Objekten bereitzustellen, während eine konsistente Objekterstellungsschnittstelle beibehalten wird.


Diskussion

Die Factory-Methode besteht darin, Objekte als Vorlagenmethode zu erstellen, um den Objekterzeugungsalgorithmus zu implementieren. Die Superklasse definiert das gesamte standardmäßige und generische Verhalten (unter Verwendung rein virtueller „Methoden“, um die Schritte der Objekterstellung zu implementieren) und delegiert dann die Details der Objekterstellung an Unterklassen, die den Clients offengelegt werden.

Die Factory-Methode macht das Anwendungsdesign anpassbarer und nur geringfügig komplexer. Andere Entwurfsmuster erfordern neue Klassen, während Factory Method nur eine neue Operation erfordert.

Die Fabrikmethode wird oft als Standardmethode zum Erstellen von Objekten verwendet. Dies ist jedoch nicht erforderlich, wenn: sich die Instanz der erstellten Klasse nie ändert oder die Instanziierung in einer Operation erstellt wird, die von Unterklassen leicht überschrieben werden kann (z. B. eine Initialisierungsoperation).

Eine Fabrikmethode ähnelt einer abstrakten Fabrik, jedoch ohne den Fokus auf die Objektfamilie.

Factory-Methoden werden typischerweise von der Architektur definiert und dann vom Benutzer des Frameworks implementiert.

Struktur

Die Implementierung der Factory-Methode, die in Gang of Four diskutiert wird, ist weitgehend die gleiche wie die Implementierung der Abstract Factory. Aus diesem Grund konzentriert sich die Darstellung in diesem Artikel auf den seitdem populär gewordenen Ansatz.

Eine immer beliebtere Definition einer Factory-Methode ist eine statische Klassenmethode, die ein Objekt des Typs dieser Klasse zurückgibt. Aber im Gegensatz zu einem Konstruktor kann das eigentliche Objekt, das er zurückgibt, eine Instanz einer Unterklasse sein. Im Gegensatz zu einem Konstruktor kann anstelle eines neu erstellten Objekts ein vorhandenes Objekt wiederverwendet werden. Im Gegensatz zu einem Konstruktor können Factory-Methoden andere und aussagekräftigere Namen haben (z. B. Color.make_RGB_color (rot schwebend, grün schwebend, blau schwebend) und Color.make_HSB_color (Farbton schwebend, Sättigung schwebend, Helligkeit schwebend).

Der Client ist vollständig von den Implementierungsdetails der abgeleiteten Klassen getrennt. Es ist jetzt möglich, Polymorphismus zu verwenden.

Beispiel

Eine Factory-Methode definiert eine Schnittstelle zum Erstellen von Objekten, ermöglicht jedoch den Unterklassen zu entscheiden, welche Klassen erstellt werden sollen. Spritzgussformen zeigen dieses Muster. Kunststoffspielzeughersteller verarbeiten Kunststoffformpulver und spritzen den Kunststoff in Formen mit gewünschten Eigenschaften. Die Klasse von Spielzeug (Auto, Actionfigur usw.) wird durch die Form bestimmt.

Kontrollliste

  1. Wenn Sie eine Vererbungshierarchie haben, die Polymorphismus unterstützt, sollten Sie erwägen, die Möglichkeit hinzuzufügen, polymorphe Objekte zu erstellen, indem Sie eine statische Factory-Methode in der Basisklasse definieren.
  2. Entwickeln Sie Argumente für die Factory-Methode. Welche Qualitäten oder Merkmale sind notwendig und ausreichend, um die richtige abgeleitete Klasse zum Instanziieren zu identifizieren?
  3. Erwägen Sie die Erstellung eines internen "Objektpools", der es ermöglicht, Objekte wiederzuverwenden, anstatt sie von Grund auf neu zu erstellen.
  4. Erwägen Sie, alle Konstruktoren privat oder geschützt zu machen

Faustregeln

  • Abstrakte Factory-Klassen werden oft mit Factory-Methoden implementiert, aber sie können mit Prototype implementiert werden.
  • Factory-Methoden werden normalerweise in Template-Methoden aufgerufen.
  • Factory-Methode: Erstellung durch Vererbung. Prototyp: Erstellung per Delegation.
  • Oft beginnen Projekte mit der Factory-Methode (weniger komplex, anpassbar, Unterklassen nehmen zu) und entwickeln sich zu Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Entwickler feststellt, dass mehr Flexibilität erforderlich ist.
  • Prototyp benötigt keine Unterklassen, aber eine Initialisierungsoperation. Die Factory-Methode erfordert das Erstellen von Unterklassen, erfordert jedoch keine Initialisierung.
  • Der Vorteil einer Factory-Methode besteht darin, dass sie dieselbe Instanz mehrmals zurückgeben kann, oder dass sie eher eine Unterklasse als ein Objekt genau dieses Typs zurückgeben kann.
  • Einige Befürworter von Factory-Methoden empfehlen, dass in Bezug auf das Sprachdesign (oder den Stil) absolut alle Konstruktoren privat oder geschützt sein sollten.
  • Der neue Operator gilt als schädlich. Es gibt einen Unterschied zwischen dem Anfordern eines Objekts und dem Erstellen. Der Operator new erstellt immer ein Objekt und kann die Objekterstellung nicht kapseln. Die Factory-Methode nutzt diese Kapselung und ermöglicht es Ihnen, ein Objekt abzufragen, ohne an den Erstellungsvorgang gebunden zu sein.
Рекомендуємо хостинг 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 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18: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 10: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 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15: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 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken