Я прочитал эти сообщения:
У меня небольшие проблемы с пониманием разницы между следующими способами создания синглетонов:
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)? Было бы полезно увидеть пример для каждого. Разве фабричный шаблон не будет полезен, если вы хотите скрыть тот факт, что класс был одноэлементным (как описано здесь )?