我已经阅读了关于S.O.的问题。关于Singleton,只看了一个小时的谷歌科技谈话。据我所知,OO世界的共识似乎是单身人士更多的是反模式而不是有用的设计模式。

那就是说,这些天我正在采访,问题出现了很多 - 什么是单身人士,你会怎样使用它?

回答这个问题的最佳方法是什么?我应该简单地描述一下设计模式,然后说我听说过唯一可以接受的用于记录的用途,它经常被错误地用于全球状态吗?

有帮助吗?

解决方案

棘手。有很多人认为单身人士本质上是一种反模式,就像你说的那样(包括我),但也有很多人认为这只是一种OOP可接受的做全局变量的方式。

如果面试官在那个阵营,那么是的,我认为他错了,但在面试中这可能不是最好的说法。 ;)

所以我可能会尝试保持中立并坚持事实。你不知道你的面试官在哪个营地,所以坚持无可争议的事实。单身人员做什么?为了证明使用方法,请坚持少数情况,大多数人都认为单身人士是可接受的答案。或者解释一下你的经历(因为人们也不能不同意这一点)。

但是你是否“为了”或“反对”单身人士,采访可能不适合为这个事业进行讨伐。 ;)

其他提示

根据您自己使用/不使用它的经验。那是任何一天最好的答案。如果您还没有使用它,但确实知道它是什么,请继续说明。大部分时间,面试官都不会冒险超越单身人士 - 所以要抓紧抓住它。

只要你准备好讨论,我认为你建议的答案是好的。但请注意,我们中的一些人仍然认为单身人士是一个有用的想法。一些数据在范围上自然是全局的,而单例提供了一种抽象数据的合理方法。如果你的语言支持这样的结构,你当然也可以在更有限的范围内使用单例,例如在特定的命名空间内。

单身人士。

根据定义,它是一个在整个应用程序中只有一个实例的对象。这可以通过使构造函数私有并通过对象定义中的公共属性提供静态实例来保证。

当您处理资源时,它是一种有用的模式,只有一个对象可以一次访问它。

然而,它有许多权衡取舍。单例实例很多都有自己的要求,因为它们必须满足它的先决条件以及被测试类的先决条件,所以测试任何使用它的类都是繁重的。

此外,在维护项目并尝试修改某些抽象时,这可能是一个问题。因此,我发现最好通过接口抽象单例。保持“单一实例”作为一个实现细节,并将单例实例作为接口传递,这意味着调用代码不依赖于类定义(和静态属性)。这样可以更容易地在以后以架构管道为代价进行测试和抽象(例如,将其传递给Ctors或setter属性)。

同样提醒大家,在GoF之前世界确实存在,我将补充一点,也可以使用Singleton模式的修改来确保每个Session或每个Thread只有一个实例,或者无论如何。只需使用每个会话或每个线程或每个任何状态来保存每个实例。

我的回答:

  哦,来吧,你不能至少找到   第二最受欢迎的问题   这个累旧的主题?你必须去第一个?我走了。   面试结束了。

或者我希望它可以......

我的回答是:

  

Singleton是一种设计模式   指定确保该方法的方法   只有一个对象的实例存在于   运行时。

     

我会自行决定使用它。

没有州的单身人士呢?我特别关注战略模式中的一些可能的幂等具体策略,纯算法,没有数据。

或Java Enum类,它们是单身人士。我发现这样的东西很有用:

public enum StringComparator implements Comparator {

  CASE_SENSITIVE {
    int compare(Object lhs, Object rhs) {
      // check for null omitted for brevity
      return lhs.equals(rhs);
    }
  },

  CASE_INSENSITIVE {
    int compare(Object lhs, Object rhs) {
      return String.CASE_INSENSITIVE_ORDER( lhs, rhs ) ;
    }
  };

  boolean equals( Object o ) {
   return this == o ;
  }
} 

我遇到过一些用途。记录很明显。另一个是使用nCurses的控制台输出。我创建了一个使用Panel对象的库,但每个都需要与控制z-orders之类的东西的单个Controller进行通信。另一个是游戏的随机数生成器。你是否真的想在每个功能中重新安装mersenne twister,或者将它传递到各处?

但是对于大多数部件来说,它们会导致糟糕的设计。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top