包a中有Class A及實例a1、a2。包b中Class B需訪問這兩個具體實例,要求:不創建新實例、A非單例。
// 包 a 中新增
package a;
public class GlobalRegistry {
public static A a1;
public static A a2;
// 可選:初始化方法
public static void init(A instance1, A instance2) {
a1 = instance1;
a2 = instance2;
}
}
// 包 a 原有代碼修改
package a;
public class A {
// ... 原有代碼
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
GlobalRegistry.init(a1, a2); // 註冊實例
}
}
// 包 b 中訪問
package b;
import a.GlobalRegistry;
public class B {
public void useA() {
A instance1 = GlobalRegistry.a1; // 直接獲取
A instance2 = GlobalRegistry.a2;
// 使用 instance1, instance2...
}
}
| 模式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 靜態容器 | 簡單直接、無依賴框架 | 全局狀態、難測試 | 小項目、舊代碼改造 |
| 依賴注入 | 解耦、可測試、生命周期管理 | 需框架支持 | Spring/Guice項目 |
| 觀察者模式 | 事件驅動、鬆耦合 | 複雜度高 | 多模塊響應 |
| Service Locator | 集中管理、延遲初始化 | 隱藏依賴 | 插件化架構 |
@Component
public class AService {
// Spring管理單例Bean
}
// 另一模塊注入使用
@Autowired
private AService aService; // 自動獲取同一實例
ConcurrentHashMap或AtomicReference「靜態容器」是理解依賴注入本質的橋梁:集中存儲、按需獲取、統一生命周期。