1. Quick Start
Java Design Patterns is the largest open-source collection of design pattern implementations in Java. Each pattern lives in its own Maven module with a self-contained App.java entry point, unit tests, UML class diagrams, and a detailed README explaining intent, real-world analogies, and trade-offs. The repository serves as both a learning resource and a reference library for software engineers at every level.
Key features:
- 166 design pattern implementations spanning Creational, Structural, Behavioral, Concurrency, Architectural, and more
- Every pattern has a runnable
App.javademonstrating the concept end-to-end - UML class diagrams in the
etc/directory for visual learners - Comprehensive unit tests for every pattern using JUnit 5
- Multi-language README translations (Arabic, Bengali, Chinese, Danish, German, Spanish, French, Greek, Hindi, Indonesian, Italian, Japanese, Marathi, Nepali, Portuguese, Russian, Sinhala, Turkish, Urdu)
- Modern Java idioms —
var, switch expressions, streams, lambdas, sealed classes
Prerequisites:
- Java 17 or later (JDK)
- Apache Maven 3.9+
Quick build and run:
git clone https://github.com/iluwatar/java-design-patterns.git
cd java-design-patterns
mvn compile -pl singleton -am
cd singleton
mvn exec:java -Dexec.mainClass="com.iluwatar.singleton.App"
Cthulhu=com.iluwatar.singleton.IvoryTower@...
Cthulhu=com.iluwatar.singleton.IvoryTower@...
Tip
You can run any pattern's demo the same way — replace
singletonwith the pattern module name (e.g.,observer,strategy,builder).
What to explore next: Browse the full pattern catalog in section 3, pick a category that interests you, and run the demos.
2. Installation
System Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| Java (JDK) | 17 | 21 (LTS) |
| Maven | 3.9+ | 3.9.6+ |
| Git | 2.x | Latest |
| Disk space | ~200 MB (source) | ~500 MB (with compiled classes) |
| RAM | 2 GB free | 4 GB free |
Clone the Repository
git clone https://github.com/iluwatar/java-design-patterns.git
cd java-design-patterns
Important
The repository contains 3,500+ files. A shallow clone saves time if you only need the latest version:
git clone --depth 1 https://github.com/iluwatar/java-design-patterns.git
Build All Patterns
mvn clean install -DskipTests
[INFO] Reactor Summary for Java Design Patterns 1.26.0-SNAPSHOT:
[INFO] java-design-patterns .......................... SUCCESS
[INFO] abstract-document ............................. SUCCESS
[INFO] abstract-factory .............................. SUCCESS
...
[INFO] BUILD SUCCESS
Build a Single Pattern
mvn compile -pl observer -am
The -pl flag selects the module; -am (also-make) builds its dependencies (the parent POM).
Verify Your Installation
mvn test -pl singleton
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
Warning
Some pattern modules (e.g.,
microservices-*,health-check,anti-corruption-layer) use Spring Boot and download additional dependencies on first build. Ensure you have a stable internet connection.
IDE Setup
IntelliJ IDEA
- File → Open → select the root
pom.xml - Choose "Open as Project"
- IntelliJ imports all 166 modules automatically
- Run any
App.javawith the green play button
Eclipse
- File → Import → Maven → Existing Maven Projects
- Select the root directory
- Eclipse discovers all submodules
- Right-click any
App.java→ Run As → Java Application
VS Code
- Install the Extension Pack for Java
- Open the root folder
- The Java extension detects the Maven structure
- Click Run above any
mainmethod
Install Troubleshooting
Error: Unsupported class file major version 65
Your Maven or IDE is using an older JDK. Set JAVA_HOME to JDK 17+:
export JAVA_HOME=/path/to/jdk-17
mvn clean install -DskipTests
Error: Could not resolve dependencies
Maven cannot reach a repository. Check your network and proxy settings in ~/.m2/settings.xml. The project uses JitPack (https://jitpack.io) as an additional repository.
Error: OutOfMemoryError during build
Increase Maven's heap:
export MAVEN_OPTS="-Xmx2g"
mvn clean install -DskipTests
Error: Plugin execution not covered by lifecycle configuration (Eclipse)
This is an Eclipse/m2e issue. Go to Window → Preferences → Maven → Errors/Warnings and set "Plugin execution not covered" to "Warning" or "Ignore".
3. Pattern Catalog
The 166 patterns are organized by category. Each pattern module follows the same structure:
pattern-name/
├── README.md ← Intent, explanation, code examples, class diagram
├── pom.xml ← Module build config
├── etc/ ← UML diagrams (.png, .urm.png)
└── src/
├── main/java/ ← Implementation
└── test/java/ ← Unit tests
Creational Patterns
Patterns that deal with object creation mechanisms.
| Pattern | Module | Description |
|---|---|---|
| Abstract Document | abstract-document |
Dynamic properties with type safety via trait interfaces |
| Abstract Factory | abstract-factory |
Create families of related objects without specifying concrete classes |
| Builder | builder |
Construct complex objects step by step |
| Factory | factory |
Centralized object creation logic |
| Factory Kit | factory-kit |
Define a factory with separated builder and creator interfaces |
| Factory Method | factory-method |
Defer instantiation to subclasses |
| Monostate | monostate |
Shared state across all instances (alternative to Singleton) |
| Multiton | multiton |
Named instances managed as a registry |
| Object Mother | object-mother |
Pre-configured test object factory |
| Object Pool | object-pool |
Reuse expensive-to-create objects |
| Property | property |
Dynamic properties attached to objects |
| Prototype | prototype |
Clone existing objects instead of creating new ones |
| Registry | registry |
Well-known object lookup |
| Singleton | singleton |
Ensure a class has only one instance |
| Step Builder | step-builder |
Enforce a construction order via a fluent interface |
| Value Object | value-object |
Immutable objects compared by value, not identity |
Structural Patterns
Patterns that compose classes and objects into larger structures.
| Pattern | Module | Description |
|---|---|---|
| Adapter | adapter |
Convert one interface to another |
| Bridge | bridge |
Decouple abstraction from implementation |
| Composite | composite |
Treat individual objects and compositions uniformly |
| Composite Entity | composite-entity |
Coarse-grained object managing internal dependent objects |
| Composite View | composite-view |
Build views from sub-view components |
| Converter | converter |
Bidirectional mapping between types |
| Decorator | decorator |
Attach additional behavior dynamically |
| Extension Objects | extension-objects |
Add functionality without modifying existing classes |
| Facade | facade |
Simplified interface to a complex subsystem |
| Flyweight | flyweight |
Share fine-grained objects to reduce memory |
| Marker Interface | marker-interface |
Empty interface to convey metadata |
| Private Class Data | private-class-data |
Restrict access to class attributes |
| Proxy | proxy |
Surrogate controlling access to another object |
| Twin | twin |
Simulate multiple inheritance |
| Virtual Proxy | virtual-proxy |
Defer expensive object creation until needed |
Behavioral Patterns
Patterns that manage algorithms and communication between objects.
| Pattern | Module | Description |
|---|---|---|
| Acyclic Visitor | acyclic-visitor |
Visitor without dependency cycles |
| Chain of Responsibility | chain-of-responsibility |
Pass a request along a chain of handlers |
| Command | command |
Encapsulate a request as an object |
| Interpreter | interpreter |
Define a grammar and interpret sentences |
| Iterator | iterator |
Sequential access to collection elements |
| Mediator | mediator |
Centralized communication between objects |
| Memento | memento |
Capture and restore object state |
| Null Object | null-object |
Default behavior instead of null checks |
| Observer | observer |
Notify dependents of state changes |
| Servant | servant |
Shared behavior across classes without inheritance |
| Specification | specification |
Combine business rules using boolean logic |
| State | state |
Alter behavior when internal state changes |
| Strategy | strategy |
Interchange algorithms at runtime |
| Template Method | template-method |
Define algorithm skeleton, defer steps to subclasses |
| Visitor | visitor |
Add operations to objects without modifying them |
Concurrency Patterns
Patterns for managing multi-threaded and asynchronous execution.
| Pattern | Module | Description |
|---|---|---|
| Active Object | active-object |
Decouple method invocation from execution in its own thread |
| Actor Model | actor-model |
Message-driven concurrency with isolated actors |
| Async Method Invocation | async-method-invocation |
Non-blocking method calls with callbacks |
| Backpressure | backpressure |
Control data flow rate between producer and consumer |
| Balking | balking |
Skip an action if the object is not in the right state |
| Double-Checked Locking | double-checked-locking |
Reduce synchronization overhead for lazy init |
| Event-Based Asynchronous | event-based-asynchronous |
Async operations with event-driven completion |
| Fanout-Fanin | fanout-fanin |
Distribute work then aggregate results |
| Guarded Suspension | guarded-suspension |
Block until a precondition is met |
| Half-Sync/Half-Async | half-sync-half-async |
Separate sync and async processing layers |
| Leader Election | leader-election |
Choose a coordinator among distributed nodes |
| Leader-Followers | leader-followers |
Thread pool with a leader that accepts and dispatches |
| Lockable Object | lockable-object |
Mutual exclusion on shared resources |
| Master-Worker | master-worker |
Distribute work to parallel workers |
| Monitor | monitor |
Mutual exclusion with condition variables |
| Producer-Consumer | producer-consumer |
Decoupled production and consumption via a buffer |
| Promise | promise |
Placeholder for an asynchronous result |
| Queue-Based Load Leveling | queue-based-load-leveling |
Buffer requests to smooth out load spikes |
| Reactor | reactor |
Demultiplex and dispatch I/O events |
| Thread Pool Executor | thread-pool-executor |
Manage a pool of reusable threads |
Architectural Patterns
Large-scale structural and organizational patterns.
| Pattern | Module | Description |
|---|---|---|
| BLoC | bloc |
Business Logic Component — reactive state management |
| Clean Architecture | clean-architecture |
Dependency rule: inner layers know nothing of outer |
| CQRS | command-query-responsibility-segregation |
Separate read and write models |
| Data Bus | data-bus |
Central communication channel for decoupled components |
| Event-Driven Architecture | event-driven-architecture |
Async event dispatch and handling |
| Event Sourcing | event-sourcing |
Persist state as a sequence of events |
| Flux | flux |
Unidirectional data flow (Action → Dispatcher → Store → View) |
| Front Controller | front-controller |
Single entry point for web requests |
| Hexagonal Architecture | hexagonal-architecture |
Ports and adapters — isolate core from infrastructure |
| Intercepting Filter | intercepting-filter |
Pre/post-processing pipeline for requests |
| Layered Architecture | layered-architecture |
Horizontal layers with defined responsibilities |
| Model-View-Controller | model-view-controller |
Separate model, view, and controller concerns |
| Model-View-Intent | model-view-intent |
Unidirectional MVI cycle |
| Model-View-Presenter | model-view-presenter |
Presenter mediates between model and view |
| Model-View-ViewModel | model-view-viewmodel |
ViewModel exposes observable state to view |
| Monolithic Architecture | monolithic-architecture |
Single deployable unit |
| Page Controller | page-controller |
Per-page request handling |
| Presentation Model | presentation-model |
UI-independent presentation logic |
| Saga | saga |
Manage distributed transactions via compensating actions |
| Separated Interface | separated-interface |
Interface in a different package from implementation |
| Service Layer | service-layer |
Application boundary encapsulating business logic |
| Service-to-Worker | service-to-worker |
Front controller delegates to command and view |
| Session Facade | session-facade |
Coarse-grained interface to fine-grained subsystems |
| Strangler | strangler |
Incrementally replace a legacy system |
| Template View | templateview |
Render dynamic content with template markers |
| View Helper | view-helper |
Encapsulate formatting logic outside the view |
Microservices Patterns
| Pattern | Module | Description |
|---|---|---|
| Aggregator Microservices | microservices-aggregrator |
Aggregate responses from multiple services |
| API Gateway | microservices-api-gateway |
Single entry point routing to backend services |
| Client-Side UI Composition | microservices-client-side-ui-composition |
Assemble UI from multiple micro-frontends |
| Distributed Tracing | microservices-distributed-tracing |
Trace requests across services |
| Idempotent Consumer | microservices-idempotent-consumer |
Safely process duplicate messages |
| Log Aggregation | microservices-log-aggregation |
Centralize logs from multiple services |
| Self-Registration | microservices-self-registration |
Services register themselves with a registry |
Data Access Patterns
| Pattern | Module | Description |
|---|---|---|
| Data Access Object | data-access-object |
Abstract data source access |
| DAO Factory | dao-factory |
Factory for creating DAO instances |
| Data Mapper | data-mapper |
Map between domain objects and data storage |
| Data Transfer Object | data-transfer-object |
Carry data between processes |
| Identity Map | identity-map |
Cache loaded objects to prevent duplicates |
| Metadata Mapping | metadata-mapping |
Map objects to tables via metadata |
| Optimistic Offline Lock | optimistic-offline-lock |
Version-based conflict detection |
| Repository | repository |
Collection-like interface for domain object access |
| Serialized Entity | serialized-entity |
Persist objects via serialization |
| Serialized LOB | serialized-lob |
Store large objects as serialized blobs |
| Table Inheritance | table-inheritance |
Map inheritance hierarchies to tables |
| Single Table Inheritance | single-table-inheritance |
One table for an entire class hierarchy |
| Table Module | table-module |
One class per database table with all logic |
| Transaction Script | transaction-script |
Organize logic as procedural transactions |
| Unit of Work | unit-of-work |
Track changes and commit them atomically |
| Version Number | version-number |
Detect concurrent modifications via version field |
Integration Patterns
| Pattern | Module | Description |
|---|---|---|
| Ambassador | ambassador |
Helper service for remote resource access |
| Anti-Corruption Layer | anti-corruption-layer |
Translate between bounded contexts |
| Circuit Breaker | circuit-breaker |
Prevent cascading failures by failing fast |
| Gateway | gateway |
Encapsulate access to external systems |
| Rate Limiting | rate-limiting-pattern |
Control request throughput |
| Retry | retry |
Retry failed operations with back-off |
| Throttling | throttling |
Limit resource consumption rate |
| Tolerant Reader | tolerant-reader |
Ignore unrecognized data in messages |
Functional and Idiom Patterns
| Pattern | Module | Description |
|---|---|---|
| Callback | callback |
Pass executable code as an argument |
| Collection Pipeline | collection-pipeline |
Chain operations on collections |
| Combinator | combinator |
Compose functions into complex operations |
| Currying | currying |
Transform multi-arg function into chained single-arg |
| Double Dispatch | double-dispatch |
Method resolution on both receiver and argument types |
| Execute Around | execute-around |
Resource setup/cleanup wrapping a user action |
| Filterer | filterer |
Composable filtering with type safety |
| Fluent Interface | fluent-interface |
Method chaining for readable API calls |
| Function Composition | function-composition |
Combine simple functions into complex ones |
| Monad | monad |
Chain operations while managing side effects |
| Mute Idiom | mute-idiom |
Suppress checked exceptions for fire-and-forget |
| Pipeline | pipeline |
Ordered processing stages transforming data |
| Trampoline | trampoline |
Stack-safe recursive computation |
Other Patterns
| Pattern | Module | Description |
|---|---|---|
| Arrange-Act-Assert | arrange-act-assert |
Test method structure pattern |
| Bytecode | bytecode |
Virtual machine instruction encoding |
| Caching | caching |
Store frequently accessed data for fast retrieval |
| Collecting Parameter | collecting-parameter |
Pass a collection through methods to accumulate results |
| Commander | commander |
Distributed command queue with retries |
| Component | component |
Entity-component composition (game dev) |
| Context Object | context-object |
Encapsulate request context across layers |
| CRTP | curiously-recurring-template-pattern |
Static polymorphism via self-referencing generics |
| Data Locality | data-locality |
Arrange data for CPU cache efficiency |
| Dependency Injection | dependency-injection |
Invert object creation responsibility |
| Dirty Flag | dirty-flag |
Avoid expensive recomputation when unchanged |
| Double Buffer | double-buffer |
Render to a back buffer, then swap |
| Dynamic Proxy | dynamic-proxy |
Runtime-generated proxy objects |
| Event Aggregator | event-aggregator |
Central hub for event routing |
| Event Queue | event-queue |
Decouple event senders and receivers via a queue |
| Feature Toggle | feature-toggle |
Enable/disable features at runtime |
| Game Loop | game-loop |
Fixed-timestep update loop for games |
| Health Check | health-check |
Expose application health status |
| Lazy Loading | lazy-loading |
Defer initialization until first use |
| Map Reduce | map-reduce |
Parallel distributed data processing |
| Money | money |
Value object for monetary amounts |
| Notification | notification |
Collect validation errors instead of throwing |
| Page Object | page-object |
UI test abstraction over page elements |
| Parameter Object | parameter-object |
Group related parameters into a single object |
| Partial Response | partial-response |
Return only requested fields |
| Poison Pill | poison-pill |
Signal a consumer to shut down |
| Publish-Subscribe | publish-subscribe |
Decoupled message broadcasting |
| RAII | resource-acquisition-is-initialization |
Bind resource lifecycle to object scope |
| Role Object | role-object |
Dynamically attach roles to objects |
| Service Locator | service-locator |
Central registry for service lookup |
| Service Stub | service-stub |
Test double replacing a real service |
| Sharding | sharding |
Distribute data across multiple stores |
| Spatial Partition | spatial-partition |
Organize objects by spatial location for fast queries |
| Special Case | special-case |
Subclass that handles edge cases with standard behavior |
| Subclass Sandbox | subclass-sandbox |
Provide operations to subclasses via protected methods |
| Type Object | type-object |
Define categories as data instead of subclasses |
| Update Method | update-method |
Per-frame update for game objects |
4. Core Usage
Running a Pattern Demo
Every pattern includes an App.java with a main method:
# Build the pattern and its dependencies
mvn compile -pl <pattern-module> -am
# Run the demo
cd <pattern-module>
mvn exec:java -Dexec.mainClass="com.iluwatar.<package>.App"
For example, running the Observer pattern:
mvn compile -pl observer -am
cd observer
mvn exec:java -Dexec.mainClass="com.iluwatar.observer.App"
Weather: rainy, 15°C, 0.0 bar
Orcs: The weather changed, brace for rain!
Hobbits: The weather changed, better stay inside!
Note
The package name within
com.iluwatarusually matches the module name with hyphens removed. For example,chain-of-responsibilitybecomescom.iluwatar.chainofresponsibility. Check theApp.javain the pattern'ssrc/main/java/directory for the exact fully-qualified class name.
Reading a Pattern
Each pattern module README follows a consistent structure:
- Intent — What problem does it solve?
- Real-world analogy — A concrete scenario making the concept intuitive
- In plain words — One-sentence explanation
- Wikipedia/authoritative definition — Formal description
- Programmatic example — Annotated Java code showing the pattern in action
- Class diagram — UML visualization of the participants
- Applicability — When to use (and when not to)
- Known uses — Real-world JDK/library examples
- Consequences — Trade-offs (benefits and drawbacks)
- Related patterns — Links to complementary patterns
- Credits — Books, articles, tutorials
Tip
Start with the "Programmatic example" section — it shows the pattern's essence in working code. Then read "Applicability" to understand when the pattern fits your specific problem.
Running Tests for a Pattern
mvn test -pl strategy
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
Run tests for all patterns:
mvn test
Using Patterns in Your Own Projects
These patterns are educational implementations. To apply them in your codebase:
- Study the pattern — Read the module README and
App.java - Identify the participants — Note the interfaces, abstract classes, and concrete classes
- Adapt to your domain — Rename classes to match your problem space
- Simplify — Production code may not need all participants shown in the demo
Warning
Do not add
java-design-patternsas a Maven dependency. It is a learning repository, not a reusable library. Copy and adapt the patterns you need into your own codebase.
Localized Content
Pattern READMEs are available in 18+ languages under localization/<language-code>/:
| Code | Language | Code | Language |
|---|---|---|---|
ar |
Arabic | ja |
Japanese |
bn |
Bengali | mr |
Marathi |
da |
Danish | ne |
Nepali |
de |
German | pt |
Portuguese |
el |
Greek | ru |
Russian |
es |
Spanish | si |
Sinhala |
fa |
Persian | tr |
Turkish |
fr |
French | ur |
Urdu |
hi |
Hindi | zh |
Chinese |
id |
Indonesian | ||
it |
Italian |
Access translations at localization/<code>/<pattern-name>/README.md.
5. Common Tasks
Finding the Right Pattern for a Problem
Goal: Identify which design pattern addresses your specific problem.
- Identify the problem category:
- "I need to create objects flexibly" → Creational
- "I need to compose or adapt objects" → Structural
- "I need to manage behavior or communication" → Behavioral
- "I need to handle threads or async work" → Concurrency
- "I need to organize large-scale structure" → Architectural
- Scan the category table in section 3 for descriptions matching your need
- Read the module README's "Applicability" section to confirm the fit
- Run the demo to see the pattern in action
Comparing Related Patterns
Goal: Understand the difference between similar patterns.
Prerequisites: Two or more pattern modules to compare.
- Read both READMEs side by side (focus on "Intent" and "Applicability")
- Run both demos and compare output
- Look at the class diagrams in
etc/for structural differences - Check the "Related Patterns" section in each README for explicit comparisons
Common comparisons:
| Pair | Key Difference |
|---|---|
| Strategy vs. State | Strategy swaps algorithms; State changes behavior based on internal state |
| Factory Method vs. Abstract Factory | Factory Method creates one product; Abstract Factory creates families |
| Decorator vs. Proxy | Decorator adds behavior; Proxy controls access |
| Observer vs. Pub-Sub | Observer is direct notification; Pub-Sub uses an intermediary channel |
| Adapter vs. Facade | Adapter converts one interface; Facade simplifies many |
| Command vs. Strategy | Command encapsulates a request; Strategy encapsulates an algorithm |
Building a Subset of Patterns
Goal: Build only the patterns you care about to save time.
# Build three specific patterns
mvn compile -pl singleton,observer,strategy -am
# Run all tests for just those three
mvn test -pl singleton,observer,strategy
Studying Concurrency Patterns Safely
Goal: Understand thread-safe patterns without race condition surprises.
- Read the pattern README carefully — concurrency patterns often include timing-sensitive behavior
- Run the demo and observe the interleaved output:
mvn compile -pl active-object -am
cd active-object
mvn exec:java -Dexec.mainClass="com.iluwatar.activeobject.App"
Orc0 is eating!
Orc0 has finished eating!
Orc0 has started to roam the wastelands.
Orc1 is eating!
...
- Examine the test in
src/test/java/for assertions about concurrent behavior - Modify timing parameters in
App.javato observe different interleavings
Note
Output ordering for concurrency demos may vary between runs — this is expected behavior, not a bug.
Using the Microservices Patterns
Goal: Run the multi-module microservices examples.
Several microservices patterns use Spring Boot and involve multiple services:
# Build the microservices API Gateway example
mvn compile -pl microservices-api-gateway -am
Important
Microservices patterns require Spring Boot (
spring-boot-starter-web) and may start embedded web servers. Check each module'spom.xmlfor specific dependencies and port configuration.
The microservices modules typically include:
- A parent module with shared configuration
- Individual service modules (e.g.,
image-microservice,price-microservice) - A gateway or aggregator module
Contributing a New Pattern
Goal: Add a new design pattern to the collection.
- Check existing patterns to avoid duplication
- Check open issues — the community tracks requested patterns (e.g., Thread-Specific Storage #3225)
- Create a new module directory following the standard structure:
my-pattern/
├── README.md
├── pom.xml
├── etc/
│ └── my-pattern.urm.png
└── src/
├── main/java/com/iluwatar/mypattern/
│ └── App.java
└── test/java/com/iluwatar/mypattern/
└── AppTest.java
- Add the module to the root
pom.xml<modules>section - Follow the existing README format (Intent, Real-world analogy, Programmatic example, Class diagram, Applicability, Known uses, Consequences, Related patterns, Credits)
- Write comprehensive JUnit 5 tests
See the Admin Guide for full contributing details and code conventions.
6. Troubleshooting
Error: Unsupported class file major version 65
Cause: Your JDK version is too old. The project requires Java 17+.
Solution:
- Check your Java version:
java -version - Install JDK 17 or later
- Set
JAVA_HOMEand ensuremvn -versionshows the correct JDK
Prevention: Use a version manager like SDKMAN to install and switch between JDK versions.
Error: Could not resolve dependencies
Cause: Maven cannot reach Maven Central or JitPack.
Solution:
- Check internet connectivity
- Check proxy settings in
~/.m2/settings.xml - Clear the local cache and rebuild:
rm -rf ~/.m2/repository/com/iluwatar mvn clean install -DskipTests
Prevention: Keep ~/.m2/settings.xml configured for your environment and proxy.
Error: OutOfMemoryError during full build
Cause: Building all 166 modules requires significant heap space.
Solution:
export MAVEN_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m"
mvn clean install -DskipTests
Prevention: Build only the modules you need with -pl.
Tests fail intermittently in concurrency modules
Cause: Timing-dependent tests may behave differently under system load. Known issue: busy-waiting loops in some patterns (#2977).
Solution:
- Re-run the failing test in isolation:
mvn test -pl <module-name> - If the failure persists, check the issue tracker for known timing bugs
- Increase test timeouts if running on CI with limited resources
Prevention: Run concurrency tests individually rather than in a full build under heavy system load.
Warning
Some patterns use
Thread.sleep()for demonstration purposes. These sleeps can cause test flakiness in resource-constrained environments.
Spring Boot patterns fail to start
Cause: Port conflicts or missing Spring dependencies.
Solution:
- Check if another process is using the default port (usually 8080):
lsof -i :8080 - Ensure all dependencies are downloaded:
mvn dependency:resolve -pl <module-name>
Prevention: Stop other local servers before running Spring-based pattern demos.
IDE shows errors but Maven build succeeds
Cause: IDE index is out of sync with Maven's dependency resolution.
Solution:
- IntelliJ: File → Invalidate Caches → Invalidate and Restart
- Eclipse: Right-click project → Maven → Update Project
- VS Code: Ctrl+Shift+P → "Java: Clean Java Language Server Workspace"
Prevention: Run mvn install -DskipTests from the command line after pulling changes, then refresh your IDE.
Tip
If only a few modules show errors, build just those with
mvn compile -pl <module> -amand re-import.
Lombok annotations not recognized by IDE
Cause: Lombok requires annotation processing support in the IDE.
Solution:
- IntelliJ: Settings → Build → Compiler → Annotation Processors → Enable
- Eclipse: Install the Lombok plugin from
lombok.jar(runjava -jar lombok.jar) - VS Code: The Java extension handles Lombok automatically with the correct dependency
Prevention: Install the Lombok IDE plugin before importing the project.
7. FAQ
Q: What Java version do I need?
JDK 17 or later. The project uses modern Java features including var local variable type inference, switch expressions, and streams.
Q: Can I use these patterns as a library dependency?
No. This is an educational repository. Copy and adapt the specific pattern code you need into your own project. The patterns are intentionally self-contained for learning purposes.
Q: How are these patterns different from the Gang of Four (GoF) book?
The repository includes all 23 original GoF patterns plus over 140 additional patterns from other authoritative sources — Martin Fowler's enterprise patterns, game programming patterns, concurrency patterns, microservices patterns, and modern Java idioms. The implementations use modern Java rather than the C++/Smalltalk of the original book.
Q: Why are some READMEs in other languages?
The project has an active community of translators. English READMEs live at <pattern>/README.md; translations are in localization/<language-code>/<pattern>/README.md. Not every pattern has been translated to every language.
Q: Is model-view-viewmodel licensed differently?
Yes. The MVVM module uses the ZK framework, which is licensed under LGPL (see lgpl-3.0.txt in the repository root). All other modules are MIT-licensed.
Q: Why do some modules use Spring Boot?
Patterns like microservices, health check, anti-corruption layer, and CQRS benefit from a real web framework to demonstrate their concepts. These modules use Spring Boot 3.4.4.
Q: How do I know which pattern to study first?
Start with the classic GoF patterns: Singleton, Factory Method, Observer, Strategy, Decorator, and Adapter. These are the most widely used and provide a foundation for understanding more complex patterns.
Q: Where do I find the UML diagrams?
Each pattern has a class diagram in its etc/ directory (usually etc/<pattern-name>.urm.png or etc/<pattern-name>.png).
Q: How can I contribute a pattern translation?
Create a directory at localization/<language-code>/<pattern-name>/, add a README.md following the existing English README structure, and submit a pull request.
Q: Why is the version 1.26.0-SNAPSHOT?
SNAPSHOT is Maven's convention for a development version. This is the canonical version of the repository — there are no published releases to Maven Central because this is a learning resource, not a library.