设计模式
设计模式是解决软件设计常见问题的可复用方案,分为三大类:创建型、结构型、行为型。
创建型
单例模式
确保一个类只有一个实例。
// 双重检查锁(推荐)
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
// 静态内部类(推荐,延迟加载 + 线程安全)
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
// 枚举(最简洁,防反射和序列化破坏)
public enum Singleton {
INSTANCE;
public void doWork() { }
}工厂方法模式
定义创建对象的接口,让子类决定实例化哪个类。
public interface Logger {
void log(String message);
}
public abstract class LoggerFactory {
public abstract Logger createLogger(); // 工厂方法
public void logMessage(String msg) {
createLogger().log(msg); // 使用工厂方法
}
}
public class FileLoggerFactory extends LoggerFactory {
@Override
public Logger createLogger() {
return new FileLogger();
}
}抽象工厂模式
创建一系列相关对象(产品族)。
public interface UIFactory {
Button createButton();
TextField createTextField();
}
public class WindowsUIFactory implements UIFactory {
public Button createButton() { return new WindowsButton(); }
public TextField createTextField() { return new WindowsTextField(); }
}
public class MacUIFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public TextField createTextField() { return new MacTextField(); }
}建造者模式
分步骤构建复杂对象,链式调用。
public class User {
private final String name;
private final String email;
private final int age;
private User(Builder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
}
public static class Builder {
private final String name; // 必填
private String email = ""; // 可选,默认值
private int age = 0;
public Builder(String name) { this.name = name; }
public Builder email(String email) { this.email = email; return this; }
public Builder age(int age) { this.age = age; return this; }
public User build() { return new User(this); }
}
}
User user = new User.Builder("Alice").email("a@b.com").age(30).build();原型模式
通过拷贝现有对象创建新对象。
public class Config implements Cloneable {
private Map<String, String> settings = new HashMap<>();
@Override
public Config clone() {
try {
Config copy = (Config) super.clone();
copy.settings = new HashMap<>(this.settings); // 深拷贝 Map
return copy;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}结构型
代理模式
控制对对象的访问,可在访问前后添加逻辑。
// 静态代理
public class LoggingService implements UserService {
private final UserService delegate;
public LoggingService(UserService delegate) {
this.delegate = delegate;
}
@Override
public User getUser(Long id) {
log.info("getUser called with id={}", id);
User user = delegate.getUser(id);
log.info("getUser returned: {}", user);
return user;
}
}
// JDK 动态代理(基于接口)
UserService proxy = (UserService) Proxy.newProxyInstance(
UserService.class.getClassLoader(),
new Class[]{UserService.class},
(p, method, args) -> {
log.info("Before: {}", method.getName());
Object result = method.invoke(target, args);
log.info("After: {}", method.getName());
return result;
}
);装饰器模式
动态地为对象添加功能,比继承更灵活。
public interface Coffee {
String getDescription();
double getCost();
}
public class SimpleCoffee implements Coffee {
public String getDescription() { return "咖啡"; }
public double getCost() { return 5.0; }
}
public abstract class CoffeeDecorator implements Coffee {
protected final Coffee coffee;
public CoffeeDecorator(Coffee coffee) { this.coffee = coffee; }
}
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) { super(coffee); }
public String getDescription() { return coffee.getDescription() + " + 牛奶"; }
public double getCost() { return coffee.getCost() + 2.0; }
}
// 使用
Coffee c = new MilkDecorator(new SimpleCoffee());
// c = new SugarDecorator(c); // 继续叠加装饰Java IO 体系大量使用装饰器模式:
BufferedInputStream(new FileInputStream(...))
适配器模式
让不兼容的接口协同工作。
// 目标接口
public interface JsonParser {
Object parse(String json);
}
// 被适配者(已有类,接口不匹配)
public class XmlParser {
public Object parseXml(String xml) { ... }
}
// 适配器
public class XmlToJsonAdapter implements JsonParser {
private final XmlParser xmlParser;
public XmlToJsonAdapter(XmlParser xmlParser) {
this.xmlParser = xmlParser;
}
@Override
public Object parse(String json) {
String xml = jsonToXml(json);
return xmlParser.parseXml(xml);
}
}外观模式
为子系统提供简化的统一接口。
public class OrderFacade {
private final InventoryService inventory;
private final PaymentService payment;
private final NotificationService notification;
public void placeOrder(Order order) {
inventory.reserve(order);
payment.charge(order);
notification.sendConfirmation(order);
}
}组合模式
将对象组合成树形结构,统一处理单个对象和组合。
public interface FileSystemNode {
void print(String indent);
long getSize();
}
public class File implements FileSystemNode {
private String name;
private long size;
public void print(String indent) { System.out.println(indent + name); }
public long getSize() { return size; }
}
public class Directory implements FileSystemNode {
private String name;
private List<FileSystemNode> children = new ArrayList<>();
public void add(FileSystemNode node) { children.add(node); }
public void print(String indent) {
System.out.println(indent + name + "/");
children.forEach(c -> c.print(indent + " "));
}
public long getSize() {
return children.stream().mapToLong(FileSystemNode::getSize).sum();
}
}行为型
观察者模式
定义对象间一对多依赖,一个对象状态改变时通知所有依赖者。
public interface Observer {
void update(Event event);
}
public class EventBus {
private final Map<String, List<Observer>> listeners = new HashMap<>();
public void subscribe(String eventType, Observer observer) {
listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(observer);
}
public void publish(String eventType, Event event) {
listeners.getOrDefault(eventType, List.of())
.forEach(o -> o.update(event));
}
}策略模式
定义算法族,使它们可以互相替换。
public interface SortStrategy {
void sort(int[] arr);
}
public class Sorter {
private SortStrategy strategy;
public void setStrategy(SortStrategy strategy) {
this.strategy = strategy;
}
public void sort(int[] arr) {
strategy.sort(arr);
}
}
// 使用
Sorter sorter = new Sorter();
sorter.setStrategy(new QuickSort());
sorter.sort(data);
sorter.setStrategy(new MergeSort());
sorter.sort(data);
// Lambda 简化
sorter.setStrategy(arr -> Arrays.sort(arr));模板方法模式
父类定义算法骨架,子类实现具体步骤。
public abstract class DataProcessor {
// 模板方法
public final void process() {
readData();
processData();
writeData();
}
protected abstract void readData();
protected abstract void processData();
protected void writeData() { // 可选重写的默认实现
System.out.println("写出数据");
}
}
public class CsvProcessor extends DataProcessor {
protected void readData() { /* 读 CSV */ }
protected void processData() { /* 处理 CSV */ }
}责任链模式
将请求沿处理者链传递,直到有人处理。
public abstract class Handler {
protected Handler next;
public Handler setNext(Handler next) {
this.next = next;
return next; // 支持链式设置
}
public abstract void handle(Request request);
}
public class AuthHandler extends Handler {
public void handle(Request request) {
if (!request.isAuthenticated()) {
throw new UnauthorizedException();
}
if (next != null) next.handle(request);
}
}
// 构建责任链
Handler chain = new AuthHandler();
chain.setNext(new RateLimitHandler())
.setNext(new LogHandler())
.setNext(new BusinessHandler());
chain.handle(request);命令模式
将请求封装为对象,支持撤销、队列、日志。
public interface Command {
void execute();
void undo();
}
public class TextEditor {
private StringBuilder text = new StringBuilder();
private Deque<Command> history = new ArrayDeque<>();
public void executeCommand(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}设计原则(SOLID)
| 原则 | 说明 |
|---|---|
| S 单一职责 | 一个类只有一个改变的理由 |
| O 开闭原则 | 对扩展开放,对修改关闭 |
| L 里氏替换 | 子类可以替换父类而不破坏程序 |
| I 接口隔离 | 不强迫依赖不使用的接口 |
| D 依赖倒置 | 依赖抽象,不依赖具体实现 |