目錄
設計模式
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)
總結
設計模式
1. 工廠模式(Factory 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");}
}
2. 建造者模式(Builder Pattern)
MyBatis 中的應用:
XMLConfigBuilder
:解析mybatis-config.xml
,逐步構建Configuration
對象。SqlSessionFactoryBuilder
:通過鏈式調用構建SqlSessionFactory
。
日常開發借鑒:
- 場景:需要分步構造復雜對象,尤其是參數多且可選時。
- 示例:構建 HTTP 請求參數、配置復雜 DTO 對象。
// 建造者示例:構建用戶對象
public class User {private String name;private int age;// 私有構造,強制使用 Builderprivate 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();
3. 動態代理模式(Dynamic Proxy Pattern)
MyBatis 中的應用:
- Mapper 接口代理:通過
MapperProxy
動態生成 Mapper 接口的實現類,將方法調用轉發到 SQL 執行邏輯。
日常開發借鑒:
- 場景:需為接口動態生成實現,或在方法調用前后添加統一邏輯(如日志、事務)。
- 示例:RPC 客戶端、AOP 切面編程、權限校驗攔截器。
// JDK 動態代理示例
public class LogProxy implements InvocationHandler {private Object target;public LogProxy(Object target) { this.target = target; }@Overridepublic 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())
);
4. 模板方法模式(Template Method Pattern)
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 {@Overrideprotected void prepareData() { ... }@Overrideprotected void formatData() { ... }
}
5. 策略模式(Strategy Pattern)
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);
6. 裝飾器模式(Decorator Pattern)
MyBatis 中的應用:
Cache
實現:通過LruCache
,FifoCache
等裝飾器為緩存添加特性。Connection
包裝:使用PooledConnection
裝飾原生連接,實現連接池管理。
日常開發借鑒:
- 場景:動態為對象添加功能,避免繼承導致的類膨脹。
- 示例:增強 IO 流(緩沖、加密)、為服務添加日志或限流功能。
// 裝飾器示例:帶加密功能的輸入流
public class EncryptedInputStream extends InputStream {private InputStream wrappedStream;public EncryptedInputStream(InputStream stream) { this.wrappedStream = stream; }@Overridepublic 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);
7. 責任鏈模式(Chain of Responsibility Pattern)
MyBatis 中的應用:
- 插件機制(Interceptor Chain):多個插件通過責任鏈模式依次攔截
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);
8. 單例模式(Singleton Pattern)
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 管理錯誤信息 | 全局配置、線程池管理 |
核心價值:
- 解耦:通過工廠、代理等模式隔離變化點。
- 擴展性:策略、裝飾器模式支持靈活擴展功能。
- 復用性:模板方法、責任鏈模式復用通用流程。
掌握這些模式的應用場景,能顯著提升代碼的可維護性和架構的靈活性。