2010-06-09 432 views
12

有人最近問了一個關於鬼魂設計模式的問題 - 我以前沒見過。什麼是鬼魂設計模式?

什麼是Ghost設計模式?它是如何實現的?我只能在網上找到關於它的片段。

+3

*糟糕的笑話,我可以做... * – 2010-06-09 18:04:11

+1

在架構採訪我常常問人,「所以,你能告訴我有關LeftHandedSpinWidget設計模式嗎?」看着他們在混亂中搏鬥。沒有LeftHandedSpinWidget設計模式。 – 2010-06-09 18:05:28

+0

@Swingline這太殘酷了。儘管Ghost是一個真正的模式。 – 2010-06-09 18:07:16

回答

21

我聽過的設計模式和'幽靈'的唯一參考文獻是Lazy-Loading

由於延遲加載僅涉及加載時,它的實際需要,你可以把它看成是一個「鬼」在那之前的對象。你可以看到它的輪廓,但是在加載之前不能真正使用它。

+0

是的,我正在閱讀,但它並沒有對我有很大的意義 – 2010-06-09 18:01:33

+0

@大衛:是的,從什麼時候有人觸摸他們的時候鬼物體實現? – intuited 2010-06-09 19:37:56

3

這不是在GOF也不福勒POEAA,我可以把它作爲類似其代理的延遲加載的時候,唯一的事情。

+0

這將是有道理的 – 2010-06-09 18:08:25

3

幽靈在PoEAA第202,206-14頁提到。鬼是一個懶惰的加載對象,只包含足夠的信息來按需要實例化自己。它們可能很有用,因爲如果它們使用加載程序註冊自己,它們可以在第一次訪問時觸發大量類似的重影(不知道如果Fowler提到那一點)。

0

我剛剛創建了一個,然後在詢問a question here in SO後才意識到它是一個Ghost模式。按照該鏈接的原始PHP代碼,這裏是一個僞代碼版本:

// A "cheap" class 
class Namespace_Original 
    { 
    // The expensive, uninitialised object 
    private Original 

    // The "cheap" data needed to initialize Original 
    private Data 

    // Constructor for the cheap class 
    public Namespace_Original(Data) 
    { 
    this.Data = Data 
    } 

    // Whenever you call a method of Original 
    public __call(method_name, method_data) 
    { 
    // Create the expensive object only the first time it's going to be used 
    if (empty(this.Original)) 
     this.Original = new Original(this.Data); 

    // Call the Original's method with it's arguments 
    this.Original.name(method_data); 
    } 
    } 

當你初始化這個便宜類,沒有什麼是內創建。這是當你實際調用一個方法時,「原始」對象被創建,如果沒有,並從中檢索數據。如果你不打算使用它,它會使你不初始化原始,如果它是一個昂貴的操作。