2010-06-09 2 views
12

Кто-то недавно задал вопрос о шаблоне проектирования Ghost - я этого раньше не видел.Что такое шаблон дизайна Ghost?

Что такое шаблон дизайна Ghost и как он реализован? Я могу найти только фрагменты в Интернете по этому поводу.

+3

* Плохие шутки, которые я мог бы сделать ... * –

+1

Во время интервью с архитектурой я обычно спрашивал людей: «Итак, можете ли вы рассказать мне что-нибудь о шаблоне дизайна LeftHandedSpinWidget?» и смотреть, как они борются с путаницей. Нет шаблона проектирования LeftHandedSpinWidget. –

+0

@Swingline Это жестоко. Призрак - подлинный образец. –

ответ

21

Единственная ссылка, которую я когда-либо слышал в Design Pattern и «Ghost», находится в Lazy-Loading.

Поскольку Lazy-loading включает в себя только загрузку объекта, когда это действительно необходимо, вы можете думать о нем как о «Призраке» до тех пор. Вы можете увидеть его схему, но не можете использовать ее до тех пор, пока она не будет загружена.

+0

Да, я читал это, но это не имело для меня большого смысла. –

+0

@ Давид: Да, когда призраки материализуются, когда кто-то их касается? – intuited

3

Это не в GOF или Fowler PoEAA, единственное, что я могу представить в нем как нечто похожее на его прокси для ленивой загрузки.

+0

Это имело бы смысл в порядке –

3

Призраки упоминаются в PoEAA, pp 202, 206-14. Призрак - это ленивый загруженный объект, который содержит достаточно информации для создания экземпляра по требованию. Они могут быть полезны, потому что они могут вызывать массовую загрузку похожих призраков при первом доступе, если они регистрируются в загрузчике (если нет, если Фаулер упоминает этот бит).

0

Я на самом деле просто создал один, а затем понял, что это был образец Призрака после запроса a question here in SO. Следуйте по этой ссылке для исходного кода 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); 
    } 
    } 

При инициализации этого дешевый класс, ничего не создается внутри него. Это когда вы на самом деле вызываете метод, который создается «Оригинальный» объект, если его не было, и данные извлекаются из этого. Это заставляет вас не инициализировать Оригинал, если вы не собираетесь его использовать, обеспечивая его дорогостоящую операцию.

Смежные вопросы