Кто-то недавно задал вопрос о шаблоне проектирования Ghost - я этого раньше не видел.
Что такое шаблон дизайна Ghost и как он реализован? Я могу найти только фрагменты в Интернете по этому поводу.
Кто-то недавно задал вопрос о шаблоне проектирования Ghost - я этого раньше не видел.
Что такое шаблон дизайна Ghost и как он реализован? Я могу найти только фрагменты в Интернете по этому поводу.
Единственная ссылка, которую я когда-либо слышал в Design Pattern и "Ghost", находится в Lazy-Loading.
Так как Lazy-loading включает только загрузку объекта, когда он действительно нужен, вы можете думать о нем как о "Призраке" до тех пор. Вы можете увидеть его схему, но не можете использовать ее до тех пор, пока она не будет загружена.
Это не в GOF или Fowler PoEAA, единственное, что я могу представить себе как нечто похожее на его прокси для ленивой загрузки.
Призраки упоминаются в PoEAA, pp 202, 206-14. Призрак - это ленивый загруженный объект, который содержит достаточно информации для создания экземпляра по требованию. Они могут быть полезны, поскольку они могут вызывать массовую загрузку похожих призраков при первом доступе, если они регистрируются в загрузчике (не знаю, если Фаулер упоминает этот бит, хотя).
Я на самом деле просто создал один, а затем понял, что это был шаблон 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 );
}
}
Когда вы инициализируете этот дешевый класс, внутри него ничего не создается. Это когда вы на самом деле вызываете метод, который создается "Оригинальный" объект, если его не было, и данные извлекаются из этого. Это заставляет вас не инициализировать оригинал, если вы не собираетесь его использовать, обеспечивая его дорогостоящую операцию.