Capital Suite
OOP concepts taught in isolation don't stick — you need a domain where inheritance, commands, and serialization all arise naturally and necessarily.
Banking is that domain. Every pattern has an obvious real-world motivation: accounts differ by behavior (inheritance), transactions must be undoable (command), balances must persist (serialization), and internal state must be protected (encapsulation).
Crystallized why patterns exist — not as abstractions to memorize, but as solutions to recurring problems that appear naturally when you build something real. The undo stack alone justified the entire Command pattern.
Would replace Java serialization with JSON (Jackson) — ObjectOutputStream is fragile across versions and makes the persistence format opaque.