2010-06-09 201 views
12

有人最近问了一个关于鬼魂设计模式的问题 - 我以前没见过。什么是鬼魂设计模式?

什么是Ghost设计模式?它是如何实现的?我只能在网上找到关于它的片段。

+3

*糟糕的笑话,我可以做... * – 2010-06-09 18:04:11

+1

在架构采访我常常问人,“所以,你能告诉我有关LeftHandedSpinWidget设计模式吗?”看着他们在混乱中搏斗。没有LeftHandedSpinWidget设计模式。 – 2010-06-09 18:05:28

+0

@Swingline这太残酷了。尽管Ghost是一个真正的模式。 – 2010-06-09 18:07:16

回答

21

我听过的设计模式和'幽灵'的唯一参考文献是Lazy-Loading

由于延迟加载仅涉及加载时,它的实际需要,你可以把它看成是一个“鬼”在那之前的对象。你可以看到它的轮廓,但是在加载之前不能真正使用它。

+0

是的,我正在阅读,但它并没有对我有很大的意义 – 2010-06-09 18:01:33

+0

@大卫:是的,从什么时候有人触摸他们的时候鬼物体实现? – intuited 2010-06-09 19:37:56

3

这不是在GOF也不福勒POEAA,我可以把它作为类似其代理的延迟加载的时候,唯一的事情。

+0

这将是有道理的 – 2010-06-09 18:08:25

3

幽灵在PoEAA第202,206-14页提到。鬼是一个懒惰的加载对象,只包含足够的信息来按需要实例化自己。它们可能很有用,因为如果它们使用加载程序注册自己,它们可以在第一次访问时触发大量类似的重影(不知道如果Fowler提到那一点)。

0

我刚刚创建了一个,然后在询问a question here in SO后才意识到它是一个Ghost模式。按照该链接的原始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); 
    } 
    } 

当你初始化这个便宜类,没有什么是内创建。这是当你实际调用一个方法时,“原始”对象被创建,如果没有,并从中检索数据。如果你不打算使用它,它会使你不初始化原始,如果它是一个昂贵的操作。