Jive 是一個開源的 Java 論壇專案,其設計目標是打造一個結構開放、健壯且易於擴展的 JSP 論壇系統。在這一目標指引下,Jive 的架構設計極為優秀,融合了設計模式、可替換皮膚、插件機制等現代化概念。對於已具備一定 Java 基礎與設計模式認知,卻仍對實際應用感到困惑的開發者而言,研讀 Jive 源碼無疑是深化理解的最佳途徑。本文整理自筆者的源碼研讀筆記,旨在提綱挈領地帶領讀者走進這個精妙的設計世界。
需特別說明的是,Jive 對設計模式的應用並未死守 GoF 書中的經典實現,而是根據實際需求進行了靈活變通,這些變通之處正是本文講解的重點。
Jive 遵循「面向介面編程,而非面向實現編程」的物件導向原則,將核心業務對象抽象為介面或抽象類。主要介面包括 Forum、ForumMessage、ForumThread、Group、User、Authorization 與 Query。從命名即可推斷其職責,下圖展示了它們之間的靜態關係:

圖 1:Jive 整體關係
Jive 內建實現(如 DbForum、DbForumMessage、DbUser)均基於資料庫與 JDBC。但若未來需改用檔案系統、LDAP 或雲端存儲作為底層支撐,只需實現相應介面(如 FileForum、FileForumMessage)並注入系統,現有業務代碼完全無需修改。這正是面向介面編程賦予的強大擴展能力。
要在不修改代碼的前提下創建不同介面實現,抽象工廠模式是關鍵。Jive 中的 AuthorizationFactory 即為一抽象工廠,負責創建 Authorization 對象。其核心實現採用「靜態工廠方法 + 反射 + 雙重檢查鎖」實現線程安全的單例工廠:
public abstract class AuthorizationFactory {
private static AuthorizationFactory factory = null;
private static String className = "com.coolservlets.forum.database.DbAuthorizationFactory";
private static void loadAuthorizationFactory() {
if (factory == null) {
synchronized (className) {
if (factory == null) {
String classNameProp = PropertyManager.getProperty("AuthorizationFactory.className");
if (classNameProp != null) className = classNameProp;
try {
Class c = Class.forName(className);
factory = (AuthorizationFactory) c.newInstance();
} catch (Exception e) {
System.err.println("Exception loading class: " + e);
e.printStackTrace();
}
}
}
}
}
public static Authorization getAuthorization() {
loadAuthorizationFactory();
return factory.createAuthorization();
}
protected abstract Authorization createAuthorization();
}
關鍵設計點:
createAuthorization() 交由子類實現,符合開閉原則。同理,ForumFactory、UserFactory 等均遵循此模式,構建起一套高度可配置、可擴展的對象創建體系。
Jive 源碼展示了如何將設計模式落地於實際產品:介面隔離變化、工廠封裝創建、配置驅動行為。研讀此代碼,不僅能掌握模式應用細節,更能體會「為擴展而設計」的架構智慧。建議讀者結合源碼逐模塊深入分析,定能收穫豐富。