Design Patterns Master
Sammelwerk zur Enterprise-Master-Reihe. Markdown und HTML sind synchron erzeugt; technische Ordner bleiben stabil.
Design Patterns Master
Dieses Sammelwerk fasst die in der Master-Reihe verwendeten Entwurfsmuster zusammen. Die Muster sind in Java-Dateien zusätzlich mit // PATTERN: markiert.
Musterkatalog
| Pattern | Gruppe | Zweck | Einsatzort | Wann vorsichtig sein |
|---|---|---|---|---|
| Aggregate | DDD | Schützt fachliche Konsistenz | Policy, Account, Shipment | Nicht für reine DTOs verwenden. |
| Repository | DDD | Abstraktion für Persistenz | PolicyRepository, LedgerRepository | Nicht als beliebige Query-Dumpingstelle missbrauchen. |
| Factory | Creational | Komplexe Objekterzeugung kapseln | PolicyFactory, InvoiceFactory | Nicht bei trivialen Konstruktoren übertreiben. |
| Strategy | Behavioral | Austauschbare Regeln | UnderwritingPolicy, RatingStrategy | Gut bei Varianten; schlecht bei Einmal-If. |
| Adapter | Architecture | Technik austauschbar halten | Postgres, MinIO, Legacy, SFTP | Ports müssen fachlich bleiben. |
| Facade | Architecture | Komplexität hinter einfacher API bündeln | Portal/Gateway Facade | Nicht als God-Service missbrauchen. |
| Command | Behavioral | Eine Absicht als Objekt formulieren | OpenAccountCommand, BookPaymentCommand | Gut für Use Cases und Tests. |
| Result Object | Robustness | Erfolg/Fehler explizit zurückgeben | Smoke-Runner und Use Cases | Nicht Exceptions komplett ersetzen. |
| Outbox | Integration | Events zuverlässig publizieren | PaymentBooked, PolicyCreated | Braucht Cleanup und Monitoring. |
| Saga | Integration | Verteilten Ablauf koordinieren | E2E Runtime Master 25 | Nicht für einfache lokale Transaktion. |
| Anti-Corruption Layer | Migration | Legacy-Modell abschirmen | Master 14/24 | Nicht zum reinen Mapper verflachen. |
| Strangler Fig | Migration | Legacy schrittweise ersetzen | Master 24 | Braucht Routing und klare Schnittgrenzen. |
Beispielhafte Pattern-Kette
// PATTERN: Command - fachliche Absicht als Eingabeobjekt
record BookPaymentCommand(String accountId, long cents) {}
// PATTERN: Result Object - Erfolg und Fehler explizit machen
record PaymentResult(boolean success, String message) {}
// PATTERN: Port - Fachkern kennt keine konkrete Datenbank
interface LedgerRepository { void append(LedgerEntry entry); }