Entwurfsmuster in C++: Wann und warum

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Entwurfsmuster in C++: Wann und warum

\n\n

Haben Sie schon einmal Code zum zehnten Mal umgeschrieben, weil neue Funktionalität die alte Architektur zerstört hat? Oder stundenlang mit Debugging verbracht, um zu verstehen, wer und warum eine globale Variable geändert hat? Kommt Ihnen bekannt vor? Dann willkommen in der Welt der Entwurfsmuster.

\n\n

Entwurfsmuster sind keine Wunderpille. Sie sind kampferprobte Lösungen für typische Probleme. Sie machen Ihren Code nicht perfekt, aber sie helfen Ihnen, die gleiche Sprache wie andere Entwickler zu sprechen und die Fallstricke zu vermeiden, auf die bereits Tausende von Programmierern vor Ihnen getreten sind.

\n\n

In diesem Artikel analysieren wir die drei Hauptgruppen von Entwurfsmustern in C++: Erzeugungsmuster, Strukturmuster und Verhaltensmuster. Wir erfahren, wann man sie einsetzen sollte und wann man besser daran vorbeigeht. Los geht's!

\n\n

Erzeugungsmuster: Kontrolle über die Objekterstellung

\n\n

Erzeugungsmuster sind für die flexible Erstellung von Objekten verantwortlich. Sie verbergen die Instanziierungslogik und machen das System unabhängig davon, wie genau seine Komponenten erstellt werden.

\n\n

Singleton (Einzelstück)

\n\n

Ein Klassiker. Stellt sicher, dass eine Klasse nur eine einzige Instanz hat, und bietet einen globalen Zugriffspunkt darauf. Klingt verlockend, aber verwenden Sie es mit Bedacht – Singleton wird oft zum Antimuster, wenn es zu einem „Gott-Objekt“ aufgebläht wird.

\n\n

Wann verwenden: Logger, Konfigurationsmanager, Thread-Pool, Arbeit mit Hardware.

\n\n

Beispiel in C++ (thread-sicher, C++11 und neuer):

\n\n
class Logger {\npublic:\n    static Logger& getInstance() {\n        static Logger instance; // Wird nur einmal initialisiert, auch bei Multithreading\n        return instance;\n    }\n\n    void log(const std::string& msg) {\n        std::cout << "[LOG]: " << msg << std::endl;\n    }\n\n    // Kopieren und Zuweisung verbieten\n    Logger(const Logger&) = delete;\n    Logger& operator=(const Logger&) = delete;\n\nprivate:\n    Logger() = default; // Privater Konstruktor\n    ~Logger() = default;\n};\n\n// Verwendung\nLogger::getInstance().log("System gestartet");
\n\n

Factory Method (Fabrikmethode)

\n\n

Definiert eine Schnittstelle zur Erstellung eines Objekts, ermöglicht es Unterklassen jedoch, den Typ des zu erstellenden Objekts zu ändern. Ideal geeignet, wenn Sie im Voraus nicht wissen, welche Klasse genau benötigt wird.

\n\n

Wann verwenden: Parsen verschiedener Formate (JSON, XML, YAML), Erstellung von UI-Elementen für verschiedene Betriebssysteme, Arbeit mit verschiedenen Datenbanken.

\n\n

Beispiel:

\n\n
// Abstraktes Produkt\nclass Document {\npublic:\n    virtual void open() = 0;\n    virtual ~Document() = default;\n};\n\n// Konkrete Produkte\nclass PDFDocument : public Document {\n    void open() override { std::cout << "Öffne PDF" << std::endl; }\n};\n\nclass WordDocument : public Document {\n    void open() override { std::cout << "Öffne Word" << std::endl; }\n};\n\n// Fabrik\nclass Application {\npublic:\n    virtual Document* createDocument() = 0; // Fabrikmethode\n    virtual ~Application() = default;\n\n    void newDocument() {\n        Document* doc = createDocument();\n        doc->open();\n        delete doc; // In echtem Code: Smart Pointer\n    }\n};\n\nclass PDFApp : public Application {\n    Document* createDocument() override { return new PDFDocument(); }\n};\n\n// Verwendung\nPDFApp app;\napp.newDocument(); // Öffne PDF
\n\n

Strukturmuster: Den Baukasten zusammensetzen

\n\n

Diese Muster helfen, Klassen und Objekte in größere Strukturen zu organisieren, während Flexibilität und Effizienz erhalten bleiben.

\n\n

Adapter (Adapter)

\n\n

Ermöglicht Objekten mit inkompatiblen Schnittstellen, zusammenzuarbeiten. Stellen Sie sich vor, Sie haben eine alte Bibliothek für die Arbeit mit XML, aber ein neues Modul erwartet JSON. Der Adapter ist Ihr Retter.

\n\n

Wann verwenden:

Blogs

Buchempfehlungen