Что такое Ghost Design Pattern?

Кто-то недавно задал вопрос о Ghost Design Pattern - я раньше такого не видел.

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

4 ответа

Решение

Единственная ссылка, которую я когда-либо слышал о Design Pattern и "Ghost", - это " Ленивая загрузка".

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

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

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

Я на самом деле только что создал один, а затем понял, что это шаблон Ghost после того, как задал вопрос здесь, в 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 );
    }
  }

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

Другие вопросы по тегам