生成单身人士

时间:2010-06-26 23:52:36

标签: java singleton

这可能听起来像一个奇怪的想法,但我还没有想到它。

假设您的应用程序最终需要一定数量的单例来执行某些I / O.您可以编写一个单例并基本上根据需要多次重现代码。

然而,作为程序员,我们应该提出创造性的解决方案,避免任何形式的冗余或重复。什么是解决方案,使多个人可以作为一个单身人士。

P.S:这是一个不能使用Spring等框架的项目。

6 个答案:

答案 0 :(得分:3)

你可以引入这样的抽象:

public abstract class Singleton<T> {
  private T object;

  public synchronized T get() {
    if (object == null) {
      object = create();
    }
    return object;
  }

  protected abstract T create();
}

然后对于每个单身人士,你只需要写下这个:

public final Singleton<Database> database = new Singleton<Database>() {
  @Override
  protected Database create() {
    // connect to the database, return the Database instance
  }
};

public final Singleton<LogCluster> logs = new Singleton<LogCluster>() {
  ...

然后你可以通过写database.get()来使用单身人士。如果尚未创建单例,则会创建并初始化它。

人们可能这样做的原因,并且喜欢反复写这样的东西:

private Database database;

public synchronized Database getDatabase() {
  if (database == null) {
    // connect to the database, assign the database field
  }
  return database;
}

private LogCluster logs;

public synchronized LogCluster getLogs() {
  ...

因为最终每个单例只有一行代码,并且初始化单例模式错误的可能性非常低。

答案 1 :(得分:3)

  

然而,作为程序员,我们应该提出创造性的解决方案,以避免任何形式的冗余或重复。

这是不正确的。作为程序员,我们应该提出符合以下标准的解决方案:

  • 满足功能要求;例如按要求执行没有错误,
  • 是在规定的时间范围内交付的,
  • 可维护;例如下一个开发人员可以阅读和修改代码,
  • 为手头的任务执行得足够快,
  • 可以在以后的任务中重复使用。

(这些标准通过降低优先级来粗略排序,但不同的上下文可能会指示不同的顺序。)

创造性不是必需的,“避免冗余或任何类型的重复”也不是。事实上,如果程序员忽略了真正的标准,这两者都会有明显的危害。

回到你的问题。你应该只是寻找替代方法来做单例,如果它真的会使代码更易于维护。复杂的“创造性”解决方案很可能会回归您(或将来必须维护您的代码的人),即使他们成功减少了重复代码的行数。

正如其他人所指出的那样(例如@BalusC),目前的想法是在很多应用类别中应该避免

答案 2 :(得分:2)

确实存在multiton模式。无论如何,我60%肯定原始问题的真正解决方案是RDBMS。

答案 3 :(得分:2)

@BalusC是对的,但我会更强烈地说,单身人士在所有情况下都是邪恶的。 Web应用程序,桌面应用程序等。只是不要这样做。

所有单身实际上都是全球数据。全球数据不好。它使单元测试不可能。它使追踪奇怪的错误变得更加困难。

“四人帮”这本书在这里是错误的。或至少在十五年后过时。

如果您只想要一个实例,请让工厂只生一个。很容易。

答案 4 :(得分:1)

如何将参数传递给创建单例的函数(例如,它的名称或特化),知道为每个唯一参数创建单例?

答案 5 :(得分:-1)

我知道你问过Java,但这里有PHP的解决方案作为例子:

abstract class Singleton
{
    protected function __construct()
    {
    }

    final public static function getInstance()
    {
        static $instances = array();

        $calledClass = get_called_class();

        if (!isset($instances[$calledClass]))
        {
            $instances[$calledClass] = new $calledClass();
        }

        return $instances[$calledClass];
    }

    final private function __clone()
    {
    }
}

然后你写下:

class Database extends Singleton {}