Сравнение способов создания синглетонов в Dart - PullRequest
0 голосов
/ 06 января 2019

Я прочитал эти сообщения:

У меня небольшие проблемы с пониманием разницы между следующими способами создания синглетонов:

1. Фабричный конструктор

class SingletonOne {

  SingletonOne._privateConstructor();

  static final SingletonOne _instance = SingletonOne._privateConstructor();

  factory SingletonOne(){
    return _instance;
  }

}

2. Статическое поле с геттером

class SingletonTwo {

  SingletonTwo._privateConstructor();

  static final SingletonTwo _instance = SingletonTwo._privateConstructor();

  static SingletonTwo get instance { return _instance;}

}

3. Статическое поле

class SingletonThree {

  SingletonThree._privateConstructor();

  static final SingletonThree instance = SingletonThree._privateConstructor();

}

Они создаются следующим образом:

SingletonOne one = SingletonOne();
SingletonTwo two = SingletonTwo.instance;
SingletonThree three = SingletonThree.instance;

Вопросы

Гюнтер Цохбауэр сказал о этот вопрос :

Нет необходимости использовать фабричный конструктор. Фабрика конструктор был удобен, когда new еще не был обязательным, потому что тогда это new MyClass() работает для классов, где конструктор возвращает новый экземпляр каждый раз или когда класс возвращал кэшированный экземпляр. Это не было обязанностью звонящих знать, как и когда объект был фактически создан.

Я не понимаю, как необязательный new теперь делает конструктор фабрики ненужным. Прежде чем вы не могли сделать что-то вроде SingletonTwo или SingletonThree выше?

Гюнтер Цохбауэр также сказал :

Вы также можете изменить static final DbHelper _db = new DbHelper._constr(); на static final DbHelper singleton = new DbHelper._constr(); и удалить одноэлементный геттер, который я предложил в моем ответ. Это зависит от вашего варианта использования. Возможно, вы не сможете использовать инициализатор поля, если вам нужны дополнительные значения конфигурации для создания пример. В вашем примере этого будет достаточно.

Каковы варианты использования для каждого из приведенных выше шаблонов синглтона (SingletonOne, SingletonTwo и SingletonThree)? Было бы полезно увидеть пример для каждого. Разве фабричный шаблон не будет полезен, если вы хотите скрыть тот факт, что класс был одноэлементным (как описано здесь )?

1 Ответ

0 голосов
/ 26 марта 2019

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

Я собираюсь добавить несколько дополнительных заметок:

  • SingletonOne при создании экземпляра выглядит как любой другой класс. Таким образом, вы можете использовать это, если хотите скрыть тот факт, что это синглтон (и оставить опцию, чтобы он не был синглтоном в будущем). Вы также можете передать аргументы в конструкторе.
  • SingletonTwo позволит вам выполнить другую работу перед возвратом экземпляра.
  • SingletonThree является самым коротким, и короткий чистый код желателен в моей книге, при прочих равных условиях.

Я отправляю это как предварительный ответ и хотел бы получить отзыв. Другие полные / лучшие ответы также приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...