2010-06-09 30 views
12

Alguien hizo una pregunta sobre el patrón de diseño fantasma recientemente: no he visto esto antes.¿Qué es el patrón de diseño fantasma?

¿Qué es el patrón de diseño fantasma y cómo se implementa? Solo puedo encontrar fragmentos en la web en referencia a esto.

+3

* Las malas bromas que podría hacer ... * –

+1

Durante las entrevistas de arquitectura solía preguntarle a la gente, "entonces, ¿puede decirme algo sobre el patrón de diseño LeftHandedSpinWidget?" y mira cómo luchan con la confusión. No hay un patrón de diseño LeftHandedSpinWidget. –

+0

@Swingline Eso es cruel. Sin embargo, el fantasma es un patrón genuino. –

Respuesta

21

La única referencia que he escuchado a un Patrón de diseño y 'Fantasma' está en Lazy-Loading.

Dado que la carga lenta implica solo cargar el objeto cuando realmente se necesita, puedes pensar que es un 'Fantasma' hasta entonces. Puede ver su esquema, pero realmente no puede usarlo hasta que esté cargado.

+0

Sí, estaba leyendo eso, pero no tenía mucho sentido para mí –

+0

@David: Sí, ¿desde cuándo los fantasmas se materializan cuando alguien los toca? – intuited

3

No está en GOF ni en Fowler PoEAA, lo único que se me ocurre es que es similar a un Proxy para carga lenta.

+0

Eso tendría sentido bien –

3

Los fantasmas se mencionan en PoEAA, pp 202, 206-14. Un fantasma es un objeto cargado de forma diferida que contiene solo la información suficiente para crear una instancia bajo demanda. Pueden ser útiles porque pueden activar una carga masiva de fantasmas similares en el primer acceso si se registran con un cargador (no sé si Fowler menciona ese bit).

0

De hecho, acabo de crear uno y luego me di cuenta de que era un patrón Fantasma después de preguntar a question here in SO. Siga ese enlace para el código PHP original, aquí está una versión pseudo-código:

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

Al inicializar esta clase barato, nada se crea en su interior. Es cuando realmente llama a un método que el objeto "Original" se crea, si no había ninguno, y los datos se recuperan de eso. No debe inicializar Original si no va a utilizarlo, siempre que sea una operación costosa.