【问题标题】:What is the Ghost Design Pattern?什么是幽灵设计模式?
【发布时间】:2011-03-01 19:27:10
【问题描述】:

最近有人问了一个关于 Ghost 设计模式的问题——我以前没见过这个。

什么是 Ghost 设计模式,它是如何实现的?我只能在网上找到sn-ps参考它。

【问题讨论】:

  • 在架构面试中,我曾经问过人们,“那么,您能告诉我有关 LeftHandedSpinWidget 设计模式的任何信息吗?”看着他们与混乱搏斗。没有 LeftHandedSpinWidget 设计模式。
  • @Swingline 这太残忍了。 Ghost 是一种真正的模式。
  • 谈论一个不存在的模式真的很难过,我的意思是,几乎每个人都同意“幽灵模式”是指代理或延迟加载,但不是 100% 确定。 GoF 说:模式的名字简洁地传达了模式的本质。一个好名字很重要,因为它会成为你设计词汇的一部分。

标签: language-agnostic design-patterns


【解决方案1】:

我实际上只是创建了一个,然后在询问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 );
    }
  }

当你初始化这个 cheap 类时,它里面没有任何东西被创建。当您实际调用一个方法时,“原始”对象被创建(如果没有),并从中检索数据。如果您不打算使用它,它会让您不初始化 Original,因为这是一项昂贵的操作。

【讨论】:

    【解决方案2】:

    在 PoEAA,第 202、206-14 页中提到了幽灵。幽灵是一个延迟加载的对象,它包含足够的信息来按需实例化自己。它们可能很有用,因为如果它们向加载器注册自己,它们可以在第一次访问时触发大量类似的幽灵(但不知道 Fowler 是否提到了这一点)。

    【讨论】:

      【解决方案3】:

      它不在 GOF 或 Fowler PoEAA 中,我唯一能想到的就是它类似于延迟加载的代理。

      【讨论】:

        【解决方案4】:

        我听过的关于设计模式和“Ghost”的唯一参考文献是Lazy-Loading

        由于延迟加载仅在实际需要时才加载对象,在此之前您可以将其视为“幽灵”。您可以看到它的轮廓,但在加载之前无法真正使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-23
          • 2011-07-11
          • 2010-09-27
          相关资源
          最近更新 更多