Что такое Ghost Design Pattern? - PullRequest
12 голосов
/ 09 июня 2010

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

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

Ответы [ 4 ]

21 голосов
/ 09 июня 2010

Единственная ссылка, которую я когда-либо слышал о шаблоне проектирования и «Призраке», находится в Ленивая загрузка .

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

4 голосов
/ 28 марта 2012

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

3 голосов
/ 09 июня 2010

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

0 голосов
/ 12 января 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...