Evgenii Legotckoi
Evgenii Legotckoi20. September 2018 09:33

Generative Designmuster - Singleton

Ziele

  1. Stellen Sie sicher, dass die Klasse nur eine Instanz hat und einen globalen Zugriffspunkt darauf bereitstellt.
  2. Gekapselte „Initialisierung zu einem bestimmten Zeitpunkt“ oder „Initialisierung bei Erstbenutzung“.

Probleme

Eine Anwendung benötigt genau eine Objektinstanz. Außerdem sind verzögerte Initialisierung und globaler Zugriff erforderlich.


Diskussion

Machen Sie die Objektklasse dafür verantwortlich, eine einzelne Instanz zu erstellen, sie zu initialisieren, darauf zuzugreifen und sie durchzusetzen. Deklarieren Sie eine Instanz als privates statisches Datenelement. Stellen Sie eine öffentliche statische Memberfunktion bereit, die den gesamten Initialisierungscode kapselt und Zugriff auf die Instanz bietet.

Der Client ruft die Accessor-Funktion (unter Verwendung des Klassennamens und des Bereichsauflösungsoperators) auf, wenn ein Verweis auf ein Singleton-Objekt erforderlich ist.

Ein Singleton sollte nur in Betracht gezogen werden, wenn alle drei der folgenden Kriterien erfüllt sind: Der Besitz einer einzelnen Instanz kann vernünftigerweise nicht zugewiesen werden

  • Das Eigentum an einer einzelnen Instanz kann vernünftigerweise keinem Objekt zugewiesen werden
  • Wünschenswerte verzögerte Initialisierung
  • Globaler Zugriff ist nicht vorgesehen

Ist eine der Bedingungen nicht erfüllt, dann ist der Singleton nicht besonders interessant.

Das Singleton-Muster kann erweitert werden, um den Zugriff auf eine anwendungsspezifische Anzahl von Instanzen zu unterstützen.

Struktur

Machen Sie die Singleton-Klasse der Instanz für den Zugriff und die "Initialisierung bei der ersten Verwendung" verantwortlich. Die einzelne Instanz ist ein privates statisches Attribut. Die Accessor-Funktion ist eine öffentliche statische Methode.

Beispiel

Das Singleton-Muster stellt sicher, dass eine Klasse nur eine Instanz hat, und bietet einen globalen Zugriffspunkt auf diese Instanz. Es ist nach dem Singleton-Set benannt, das als Set definiert ist, das ein Element enthält. Das Amt des Präsidenten der Vereinigten Staaten ist Singleton. Die Verfassung der Vereinigten Staaten bestimmt die Art und Weise, wie der Präsident gewählt wird, begrenzt die Amtszeit und bestimmt die Reihenfolge der Nachfolge. Infolgedessen kann es zu einem bestimmten Zeitpunkt höchstens einen amtierenden Präsidenten geben. Unabhängig von der Identität des Amtsinhabers ist der Titel „Präsident der Vereinigten Staaten“ ein globaler Hotspot, der eine Person in einem Amt identifiziert.

Kontrollliste

  1. Definieren Sie ein privates statisches Attribut in der Klasse "Sigleton".
  2. Definieren Sie eine öffentliche statische Zugriffsfunktion in der Klasse.
  3. Führen Sie eine "träge Initialisierung" (Erstellung bei der ersten Verwendung) in der Zugriffsfunktion durch.
  4. Definieren Sie alle Konstruktoren als privat oder geschützt.
  5. Clients können nur die Zugriffsfunktion verwenden, um mit Singleton zu arbeiten.

Faustregeln

  • Abstract Factory, Builder und Prototype können Singleton in ihrer Implementierung verwenden.
  • Fassadenobjekte sind oft Singletons, da nur ein Fassadenobjekt benötigt wird.
  • Zustandsobjekte sind oft Singletons.
  • Der Vorteil von Singleton gegenüber Globals besteht darin, dass Sie bei der Verwendung von Singleton die Anzahl der Instanzen absolut sicher kennen und auch den Code ändern können, um eine beliebige Anzahl von Instanzen zu verwalten.
  • Das Singleton-Entwurfsmuster ist eines der unhandlicheren Muster. Singletons sollen verwendet werden, wenn eine Klasse genau eine Instanz haben muss, nicht mehr und nicht weniger. Entwickler verwenden Singletons oft in einem fehlgeleiteten Versuch, globale Variablen zu ersetzen. Singleton wird globale Variablen nicht abschaffen; es benennt sie nur um.
  • Wann wird ein Singleton nicht benötigt? Kurze Antwort: meistens. Lange Antwort: Wann ist es einfacher, die Ressource eines Objekts als Referenz an die Objekte zu übergeben, die sie benötigen, anstatt den Objekten global auf die Ressource zugreifen zu lassen? Das eigentliche Problem mit Singletons ist, dass sie Ihnen eine so gute Ausrede liefern, nicht über die entsprechende Objektsichtbarkeit nachzudenken. Das Finden der richtigen Balance zwischen Exposition und Objektschutz ist entscheidend für die Aufrechterhaltung der Codeflexibilität.
Рекомендуємо хостинг 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