Подтвердить что ты не робот

Что такое шаблон дизайна Ghost?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Я на самом деле просто создал один, а затем понял, что это был шаблон 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 going to be used
    if (empty(this.Original))
      this.Original = new Original(this.Data);

    // Call the Original method with it arguments
    this.Original.name( method_data );
    }
  }

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