Генерация синглетонов - PullRequest
6 голосов
/ 27 июня 2010

Это может звучать как странная идея, и я еще не продумал ее должным образом.

Скажем, у вас есть приложение, которое требует определенного количества синглетонов, например, для ввода-вывода. Вы можете написать один синглтон и в основном воспроизводить код столько раз, сколько вам нужно.

Однако, как программисты, мы должны придумывать изобретательные решения, которые избегают избыточности или повторения любого рода. Каково было бы решение сделать несколько вещей, каждый из которых мог бы действовать как синглтон?

P.S .: Это для проекта, в котором не может использоваться такая среда, как Spring.

Ответы [ 6 ]

3 голосов
/ 27 июня 2010

Однако, как программисты, мы должны придумывать изобретательные решения, которые избегают избыточности или повторения любого рода.

Это не правильно.Как программисты, мы должны предлагать решения, которые соответствуют следующим критериям:

  • соответствует функциональным требованиям;например, выполнять как требуется, без ошибок,
  • доставляются в установленные сроки,
  • могут быть сохранены;например, следующий разработчик может прочитать и изменить код,
  • выполняет достаточно быстро для поставленной задачи, и
  • может быть повторно использован в будущих задачах.

(Эти критерии примерно упорядочены по уменьшению приоритета, хотя разные контексты могут диктовать другой порядок.)

Изобретательность НЕ является требованием, и «избегайте [ing] избыточности или повторения любого рода» тоже нет.На самом деле оба они могут быть явно вредными ... если программист игнорирует реальные критерии.

Вернем это к вашему вопросу.Вам следует искать альтернативные способы создания синглетонов только в том случае, если это действительно сделает код более понятным.Сложные «изобретательные» решения вполне могут вернуться к bite вам (или людям, которым придется поддерживать ваш код в будущем), даже если им удастся сократить количество строк повторяющегося кода.

И как уже указывали другие (например, @BalusC), в настоящее время считается, что шаблон синглтона должен быть избегаемым во многих классах приложений.

3 голосов
/ 27 июня 2010

Вы можете ввести абстракцию как это:

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() {
  ...

Это связано с тем, что в конце для каждого синглтона остается только еще одна строка кода, и вероятность ошибочного использования шаблона инициализации-синглтона довольно мала.

2 голосов
/ 27 июня 2010

@ BalusC прав, но я скажу это более решительно, синглтоны злы во всех контекстах.Веб-приложения, настольные приложения и т. Д. Только не делайте этого.

Все, что в действительности является синглтоном, - это глобальный пакет данных.Глобальные данные плохие.Это делает правильное модульное тестирование невозможным.Это делает поиск странных ошибок намного, намного сложнее.

Книга «Банды четырех» здесь совершенно неверна.Или, по крайней мере, устарели на полтора десятилетия.

Если вам нужен только один экземпляр, создайте фабрику, которая производит только один экземпляр.Это просто.

2 голосов
/ 27 июня 2010

Существует шаблон мультитон . Несмотря на это, я на 60% уверен, что реальным решением исходной проблемы является СУБД.

1 голос
/ 27 июня 2010

Как насчет передачи параметра в функцию, которая создает синглтон (например, его имя или специализацию), который знает, как создать синглтон для каждого уникального параметра?

0 голосов
/ 27 июня 2010

Я знаю, что вы спрашивали о 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 {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...