虛擬代理模式(Virtual Proxy)是一種節省內存的技術,它建議創建那些占用大量內存或處理復雜的對象時,把創建這類對象推遲到使用它的時候。在特定的應用中,不同部分的功能由不同的對象組成,應用啟動的時候,不會立即使用所有的對象。在這種情況下,虛擬代理模式建議推遲對象的創建直到應用程序需要它為止。對象被應用第一次引用時創建并且同一個實例可以被重用。這種方法優缺點并存。
優點:
這種方法的優點是,在應用程序啟動時,由于不需要創建和裝載所有的對象,因此加速了應用程序的啟動。
缺點:
因為不能保證特定的應用程序對象被創建,在訪問這個對象的任何地方,都需要檢測確認它不是空(null)。也就是,這種檢測的時間消耗是最大的缺點。
應用虛擬代理模式,需要設計一個與真實對象具有相同接口的單獨對象(指虛擬代理)。不同的客戶對象可以在創建和使用真實對象地方用相應的虛擬對象來代替。虛擬對象把真實對象的引用作為它的實例變量維護。代理對象不要自動創建真實對象,當客戶需要真實對象的服務時,調用虛擬代理對象上的方法,并且檢測真實對象是否被創建。
如果真實對象已經創建,代理把調用轉發給真實對象,如果真實對象沒有被創建:
1) 代理對象創建真實對象
2) 代理對象把這個對象分配給引用變量。
3) 代理把調用轉發給真實對象
按照這種安排,驗證對象存在和轉發方法調用這些細節對于客戶是不可見的??蛻魧ο缶拖窈驼鎸崒ο笠粯优c代理對象進行交互。因此客戶從檢測真實對象是否為null中解脫出來,另外,由于創建代理對象在時間和處理復雜度上要少于創建真實對象。因此,在應用程序啟動的時候,用代理對象代替真實對象初始化。
例子:
假設我們建立一個JAVA程序的集成開發環境(Integrated Development Environment),這個環境包括三個功能:編譯、運行、生成JavaDoc文檔。在新建和編輯Java程序時,最為常用的是編譯和運行。至于生成JavaDoc文檔對于每一個Java程序不是必需的。因此,在Java開發環境啟動時,不要創建和裝載實現集成開發環境全部功能的所有對象,僅創建那些在編輯、編譯、運行時用到的對象,保留提供生成JavaDoc文檔的對象,這是一個好的設計思想。這種對象創建策略能夠高效地利用內存空間并且加快了集成開發環境的啟動速度。
假設編譯、運行、生成JavaDoc文檔這些功能分別由三個工具類提供??Compiler、Runtime和JavaDoc??蛻魧ο罂梢栽L問的不同IDE操作的接口以抽象類IDEOperation的形式定義。
public abstract class IDEOperation { private Compiler cmp; private Runtime rtime; public void compile(String javaFile) { cmp.compile(javaFile); } public void run(String classFile) { rtime.run (classFile); } //to be delayed until needed. public abstract void generateDocs(String javaFile); public IDEOperation() { cmp = new Compiler(); rtime = new Runtime(); } } |
public class RealProcessor extends IDEOperation { JavaDoc jdoc; public RealProcessor() { super(); jdoc = new JavaDoc(); } public void generateDocs(String javaFile) { jdoc.generateDocs(javaFile); } } |
原文轉自:http://www.anti-gravitydesign.com