2010-06-09 13 views
12

Qualcuno ha recentemente fatto una domanda sul Ghost Design Pattern - non l'ho mai visto prima.Che cos'è il Ghost Design Pattern?

Che cos'è Ghost Design Pattern e come viene implementato? Posso trovare solo frammenti sul web in riferimento ad esso.

+3

* Le cattive battute che potrei fare ... * –

+1

Durante le interviste di architettura ero solito chiedere alle persone, "quindi, puoi dirmi qualcosa sul modello di progettazione LeftHandedSpinWidget?" e guardarli lottare con la confusione. Non esiste un modello di progettazione LeftHandedSpinWidget. –

+0

@ Swingline È crudele. Tuttavia, Ghost è un modello originale. –

risposta

21

L'unico riferimento che ho mai sentito a un modello di progettazione e 'Ghost' è in Lazy-Loading.

Poiché il caricamento a livello lento implica solo il caricamento dell'oggetto quando è effettivamente necessario, è possibile considerarlo come un "fantasma" fino a quel momento. Puoi vedere il suo contorno, ma non puoi usarlo fino a quando non viene caricato.

+0

Sì, stavo leggendo quello, ma non aveva molto senso per me –

+0

@David: Sì, da quando si materializzano i fantasmi quando qualcuno li tocca? – intuited

3

Non è in GOF né Fowler PoEAA, l'unica cosa che posso pensare è qualcosa di simile a un Proxy per il caricamento lazy.

+0

Questo avrebbe un senso –

3

I fantasmi sono menzionati in PoEAA, pp 202, 206-14. Un fantasma è un oggetto caricato pigro che contiene informazioni sufficienti per istanziare se stesso su richiesta. Possono essere utili perché possono attivare un carico di massa di fantasmi simili al primo accesso se si registrano con un caricatore (non so se Fowler menziona quel bit).

0

In realtà ne ho appena creato uno e ho realizzato che si trattava di un pattern Ghost dopo aver richiesto a question here in SO. Seguite questo link per il codice PHP originale, ecco una versione pseudo-codice:

// 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); 
    } 
    } 

Quando si inizializza questa classe buon mercato, nulla si crea al suo interno. È quando in realtà si chiama un metodo che viene creato l'oggetto "Originale", se non ce ne sono, e i dati recuperati da quello. Ti fa non inizializzare Original se non hai intenzione di usarlo, a condizione che sia un'operazione costosa.