應用啟動時,某些功能物件(大型圖片、複雜報表引擎、Javadoc 生成器)佔用大量記憶體/啟動緩慢,但使用者可能**從未使用**該功能。虛擬代理建議:**等到真正需要時才建立真實物件**。
| 優點 | 缺點 |
|---|---|
| 加快啟動速度、降低初始記憶體佔用 | 每次存取前需檢查 null,增加微小開銷與代碼複雜度 |
| 客戶端無感知,介面一致 | 首次使用會有建立延遲(可用背景執行緒預載緩解) |
public abstract class IDEOperation {
private final Compiler compiler = new Compiler();
private final Runtime runtime = new Runtime();
public void compile(String javaFile) { compiler.compile(javaFile); }
public void run(String classFile) { runtime.run(classFile); }
// 抽象方法:由具體實現決定何時建立 Javadoc 物件
public abstract void generateDocs(String javaFile);
}
public class RealProcessor extends IDEOperation {
private final JavaDoc jdoc = new JavaDoc(); // 啟動時建立,佔記憶體
@Override
public void generateDocs(String javaFile) { jdoc.generateDocs(javaFile); }
}
public class ProxyProcessor extends IDEOperation {
private RealProcessor realProcessor; // 初始為 null
@Override
public void generateDocs(String javaFile) {
if (realProcessor == null) { // 1. 首次呼叫時建立
realProcessor = new RealProcessor();
}
realProcessor.generateDocs(javaFile); // 2. 轉發呼叫
}
}
public class Client {
public static void main(String[] args) {
IDEOperation ide = new ProxyProcessor(); // 輕量啟動
ide.compile("Test.java"); // 直接用 compiler/runtime
ide.run("Test.class");
// ... 使用者工作一段時間 ...
ide.generateDocs("Test.java"); // 首次需要時才載入 Javadoc 引擎
}
}
null 檢查後建立並快取,後續直接轉發。synchronized 確保單例。虛擬代理是空間換時間、啟動換首次延遲的經典策略。正確識別「重量級、低頻率、非必要」的物件套用此模式,能顯著提升應用啟動體驗與記憶體效率。