Patterns créationnels
Singleton
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
Utilisé pour la création d'objets uniques, comme les connexions à une base de données.
Factory Method
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
public abstract class ShapeFactory {
public abstract Shape createShape();
public static Shape getShape(String shapeType) {
if (shapeType == null) return null;
if (shapeType.equalsIgnoreCase("CIRCLE")) return new Circle();
return null;
}
}
Utilisé pour créer des objets sans spécifier la classe exacte.
Patterns structurels
Adapter
public interface Target {
void request();
}
public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee method called");
}
}
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
Utilisé pour permettre à deux interfaces incompatibles de travailler ensemble.
Bridge
public abstract class Abstraction {
protected Implementation implementation;
public Abstraction(Implementation implementation) {
this.implementation = implementation;
}
public void operation() {
implementation.operationImp();
}
}
public interface Implementation {
void operationImp();
}
public class ConcreteImplementationA implements Implementation {
@Override
public void operationImp() {
System.out.println("Concrete implementation A");
}
}
Utilisé pour séparer l'interface d'une classe de son implémentation.
Patterns comportementaux
Observer
import java.util.ArrayList;
import java.util.List;
public interface Observer {
void update(String message);
}
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
Utilisé pour mettre en place une relation "un à plusieurs" entre des objets, afin que quand un objet change d'état, tous ses observateurs soient informés.
Strategy
public interface PaymentStrategy {
void pay(int amount);
}
public class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("Paid with credit card: " + amount);
}
}
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
Utilisé pour encapsuler un ensemble de comportements qui peuvent être interchangeables.