Basic design patterns in Java
Here are some of the most commonly used design patterns in Java, especially in Spring Boot projects, along with real-world examples:
✅ 1. Singleton Pattern
Purpose: Ensure only one instance of a class exists.
🧠 Use case: Spring-managed beans (@Component
, @Service
) by default are Singletons.
@Component
public class AppConfig {
// only one instance in the Spring context
}
✅ 2. Factory Pattern
Purpose: Create objects without exposing creation logic.
🧠 Use case: SessionFactory
in Hibernate, DocumentBuilderFactory
, or creating different NotificationService
instances.
public class NotificationFactory {
public Notification getNotification(String type) {
if ("email".equals(type)) return new EmailNotification();
if ("sms".equals(type)) return new SMSNotification();
return null;
}
}
✅ 3. Builder Pattern
Purpose: Build complex objects step by step.
🧠 Use case: Creating ResponseEntity
, or building custom DTOs in layers.
User user = User.builder()
.name("Alice")
.age(30)
.email("a@x.com")
.build();
✅ 4. Prototype Pattern
Purpose: Create a new object by copying an existing one.
🧠 Use case: Cloning a template configuration, or in Spring when you define @Scope("prototype")
.
@Component
@Scope("prototype")
public class TemporaryFileHandler { ... }
✅ 5. Adapter Pattern
Purpose: Allows incompatible interfaces to work together.
🧠 Use case: Integrating third-party APIs in Spring Boot using RestTemplate
or WebClient
.
public class LegacySystemAdapter implements NewSystemInterface {
private LegacySystem legacy;
public String fetchData() {
return legacy.getDataLegacy(); // adapts method name
}
}
✅ 6. Decorator Pattern
Purpose: Add new behavior to objects dynamically.
🧠 Use case: Spring’s OncePerRequestFilter
or interceptors decorating HTTP requests/responses.
@Component
public class LoggingFilter extends OncePerRequestFilter {
protected void doFilterInternal(...) {
// log request details
filterChain.doFilter(request, response);
}
}
✅ 7. Observer Pattern
Purpose: One object notifies many others of changes.
🧠 Use case: Spring’s event system (ApplicationEventPublisher
)
@Component
public class OrderService {
@Autowired ApplicationEventPublisher publisher;
public void placeOrder(Order order) {
// logic...
publisher.publishEvent(new OrderPlacedEvent(order));
}
}
✅ 8. Strategy Pattern
Purpose: Select algorithm at runtime.
🧠 Use case: Payment methods (card, PayPal), sorting algorithms, Spring Security password encoders.
public interface PaymentStrategy {
void pay(int amount);
}
public class CardPayment implements PaymentStrategy { ... }
public class PayPalPayment implements PaymentStrategy { ... }
✅ 9. Template Method Pattern
Purpose: Define a skeleton of an algorithm, subclasses fill in the steps.
🧠 Use case: JdbcTemplate
, RestTemplate
, and AbstractController
public abstract class ReportGenerator {
public void generateReport() {
fetchData();
process();
export();
}
abstract void fetchData();
abstract void process();
abstract void export();
}
✅ 10. Proxy Pattern
Purpose: Control access to another object (add extra functionality like logging, security)
🧠 Use case: Spring AOP, Hibernate lazy loading, transaction proxy
@Around("execution(* com.service.*.*(..))")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before method: " + joinPoint.getSignature());
Object result = joinPoint.proceed();
System.out.println("After method");
return result;
}
🧠 Summary Table
Pattern | Used For | Real-Time Example in Spring |
---|---|---|
Singleton | One shared instance | @Component , @Service |
Factory | Centralized object creation | SessionFactory |
Builder | Step-by-step object creation | Lombok @Builder , DTOs |
Prototype | New instance every time | @Scope("prototype") |
Adapter | Integrating incompatible APIs | REST API wrappers |
Decorator | Add extra behavior | Servlet filters, logging |
Observer | Publish/subscribe | Spring Events |
Strategy | Dynamic behavior selection | Payment services |
Template Method | Reusable skeleton methods | JdbcTemplate , RestTemplate |
Proxy | Intercept method calls | AOP, Logging, Transactions |
Let me know if you want diagrams or code implementations for any of these!
Comments
Post a Comment