Entwurfsmuster im Maven Master 2
Aggregate Root
Zweck: Konsistenzgrenze fuer Bestellungen
Einsatzort: order-domain/Order.java
Begruendung: Zentralisiert Invarianten und Events
Value Object
Zweck: Unveraenderliche Fachwerte
Einsatzort: shared-kernel/Money.java, order-domain/OrderLine.java
Begruendung: Verhindert Primitive Obsession
Repository
Zweck: Persistenz-Port im Domain-Modell
Einsatzort: order-domain/OrderRepository.java
Begruendung: Domain bleibt DB-neutral
Factory Method
Zweck: Kontrollierte Aggregate-Erzeugung
Einsatzort: Order.start(), OrderId.newId()
Begruendung: Keine ungueltigen Startzustaende
Domain Event
Zweck: Fachliche Ereignisse explizit machen
Einsatzort: OrderPlaced.java
Begruendung: Entkopplung von Folgeprozessen
Specification
Zweck: Regeln kombinierbar ausdruecken
Einsatzort: OrderSpecification.java
Begruendung: Testbare Fachbedingungen
Strategy
Zweck: Preislogik austauschbar machen
Einsatzort: PricingStrategy.java
Begruendung: Varianten ohne if-Kaskaden
Policy
Zweck: Fachentscheidung kapseln
Einsatzort: CustomerCreditPolicy, InventoryReservationPolicy
Begruendung: Regeln bleiben eigenstaendig
Application Service
Zweck: Use Case orchestrieren
Einsatzort: PlaceOrderService.java
Begruendung: Keine Framework-Logik in Domain
Command
Zweck: Benutzerabsicht transportieren
Einsatzort: PlaceOrderCommand.java
Begruendung: Eingabe bleibt explizit und testbar
CQRS
Zweck: Lesen und Schreiben trennen
Einsatzort: OrderQueryService.java
Begruendung: Read Model darf optimiert sein
Adapter
Zweck: Technologie an Ports anschliessen
Einsatzort: REST, JPA, Kafka, Legacy
Begruendung: Austauschbarkeit
Facade
Zweck: Einheitliche REST-Fehler
Einsatzort: RestExceptionMapper.java
Begruendung: API bleibt konsistent
Data Mapper
Zweck: Entity von Domain trennen
Einsatzort: OrderEntity.java
Begruendung: JPA leakt nicht in Aggregate
Unit of Work
Zweck: Transaktionsgrenze kapseln
Einsatzort: TransactionBoundary.java
Begruendung: Application bleibt Framework-neutral
Transactional Outbox
Zweck: Dual-Writes vermeiden
Einsatzort: OutboxRecord.java
Begruendung: Event und Fachzustand in einer TX
Saga
Zweck: Verteilte Prozesse koordinieren
Einsatzort: PaymentSaga.java
Begruendung: Keine globale XA-Transaktion
Anti-Corruption Layer
Zweck: Legacy entkoppeln
Einsatzort: LegacyOrderGateway.java
Begruendung: Alte Modelle kontaminieren Domain nicht
Gateway
Zweck: Externes System kapseln
Einsatzort: LegacySoapClient.java
Begruendung: Technischer Zugriff bleibt schmal
Idempotent Consumer
Zweck: Retry-sicher verarbeiten
Einsatzort: IdempotentConsumerGuard.java
Begruendung: Doppelte Messages werden unschaedlich
Composition Root
Zweck: Verdrahtung zentralisieren
Einsatzort: EnterpriseSpringApplication, Quarkus Wiring
Begruendung: Domain baut keine Infrastruktur
Fitness Function
Zweck: Architektur pruefbar machen
Einsatzort: LayerRulesTest.java
Begruendung: Regeln werden Build-Bestandteil