目录
设计模式
1. 工厂模式(Factory Pattern)
2. 建造者模式(Builder Pattern)
3. 动态代理模式(Dynamic Proxy Pattern)
4. 模板方法模式(Template Method Pattern)
5. 策略模式(Strategy Pattern)
6. 装饰器模式(Decorator Pattern)
7. 责任链模式(Chain of Responsibility Pattern)
8. 单例模式(Singleton Pattern)
总结
MyBatis 中的应用:
SqlSessionFactory
:通过工厂创建 SqlSession
对象,屏蔽了底层连接池、事务等细节。ObjectFactory
:负责创建结果集映射的 Java 对象(如 POJO),支持自定义扩展。日常开发借鉴:
// 简单工厂示例
public class ConnectionFactory {
public static Connection getConnection(String dbType) {
if ("mysql".equals(dbType)) {
return new MySqlConnection();
} else if ("oracle".equals(dbType)) {
return new OracleConnection();
}
throw new IllegalArgumentException("Unsupported DB type");
}
}
MyBatis 中的应用:
XMLConfigBuilder
:解析 mybatis-config.xml
,逐步构建 Configuration
对象。SqlSessionFactoryBuilder
:通过链式调用构建 SqlSessionFactory
。日常开发借鉴:
// 建造者示例:构建用户对象
public class User {
private String name;
private int age;
// 私有构造,强制使用 Builder
private User(Builder builder) { ... }
public static class Builder {
private String name;
private int age;
public Builder name(String name) { this.name = name; return this; }
public Builder age(int age) { this.age = age; return this; }
public User build() { return new User(this); }
}
}
// 使用
User user = new User.Builder().name("Alice").age(30).build();
MyBatis 中的应用:
MapperProxy
动态生成 Mapper 接口的实现类,将方法调用转发到 SQL 执行逻辑。日常开发借鉴:
// JDK 动态代理示例
public class LogProxy implements InvocationHandler {
private Object target;
public LogProxy(Object target) { this.target = target; }
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Method " + method.getName() + " called");
return method.invoke(target, args);
}
}
// 使用
UserService userService = (UserService) Proxy.newProxyInstance(
UserService.class.getClassLoader(),
new Class[]{UserService.class},
new LogProxy(new UserServiceImpl())
);
MyBatis 中的应用:
Executor
接口:定义了 update
, query
等方法的执行流程,具体实现由子类(如 SimpleExecutor
, BatchExecutor
)完成。BaseExecutor
:抽象类封装了缓存管理、事务提交等通用逻辑,子类仅需实现 doUpdate
, doQuery
等具体步骤。日常开发借鉴:
// 模板方法示例:数据导出
public abstract class DataExporter {
// 模板方法:定义流程
public final void export() {
prepareData();
formatData();
saveToFile();
}
protected abstract void prepareData();
protected abstract void formatData();
private void saveToFile() {
System.out.println("Saving data to file...");
}
}
// 子类实现
public class CsvExporter extends DataExporter {
@Override
protected void prepareData() { ... }
@Override
protected void formatData() { ... }
}
MyBatis 中的应用:
Executor
类型选择:根据配置选择 SIMPLE
, REUSE
, BATCH
等执行策略。TypeHandler
选择:根据 Java 类型和 JDBC 类型动态选择处理器。日常开发借鉴:
// 策略模式示例:支付方式
public interface PaymentStrategy {
void pay(double amount);
}
public class AlipayStrategy implements PaymentStrategy { ... }
public class WechatPayStrategy implements PaymentStrategy { ... }
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) { this.strategy = strategy; }
public void executePay(double amount) { strategy.pay(amount); }
}
// 使用
PaymentContext context = new PaymentContext(new AlipayStrategy());
context.executePay(100.0);
MyBatis 中的应用:
Cache
实现:通过 LruCache
, FifoCache
等装饰器为缓存添加特性。Connection
包装:使用 PooledConnection
装饰原生连接,实现连接池管理。日常开发借鉴:
// 装饰器示例:带加密功能的输入流
public class EncryptedInputStream extends InputStream {
private InputStream wrappedStream;
public EncryptedInputStream(InputStream stream) { this.wrappedStream = stream; }
@Override
public int read() throws IOException {
int data = wrappedStream.read();
return decrypt(data); // 解密逻辑
}
private int decrypt(int data) { ... }
}
// 使用
InputStream rawStream = new FileInputStream("data.bin");
InputStream encryptedStream = new EncryptedInputStream(rawStream);
MyBatis 中的应用:
Executor
, StatementHandler
等方法调用。日常开发借鉴:
// 责任链示例:权限校验链
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
public class AuthFilter implements Filter {
public void doFilter(Request request, Response response, FilterChain chain) {
if (checkAuth(request)) {
chain.doFilter(request, response); // 传递到下一个过滤器
} else {
response.setError("Unauthorized");
}
}
}
// 使用
FilterChain chain = new FilterChain();
chain.addFilter(new AuthFilter()).addFilter(new LogFilter());
chain.doFilter(request, response);
MyBatis 中的应用:
ErrorContext
:线程级别的单例,记录当前线程的 SQL 执行错误信息。LogFactory
:通过单例管理日志实现类。日常开发借鉴:
// 单例示例:双重校验锁
public class DatabasePool {
private static volatile DatabasePool instance;
private DatabasePool() { ... }
public static DatabasePool getInstance() {
if (instance == null) {
synchronized (DatabasePool.class) {
if (instance == null) {
instance = new DatabasePool();
}
}
}
return instance;
}
}
设计模式 |
MyBatis 应用场景 |
日常开发借鉴场景 |
工厂模式 |
SqlSessionFactory 创建对象 |
数据库连接池、日志工厂 |
建造者模式 |
构建 Configuration 对象 |
复杂 DTO 构建、HTTP 请求参数封装 |
动态代理 |
Mapper 接口实现 |
RPC 客户端、AOP 切面 |
模板方法 |
Executor 执行流程 |
统一流程(支付、导出) |
策略模式 |
不同 Executor 实现选择 |
算法切换(排序、支付方式) |
装饰器模式 |
Cache 功能增强 |
IO 流增强(缓冲、加密) |
责任链模式 |
插件拦截器链 |
过滤器链(权限、日志) |
单例模式 |
ErrorContext 管理错误信息 |
全局配置、线程池管理 |
核心价值:
掌握这些模式的应用场景,能显著提升代码的可维护性和架构的灵活性。