Не принято, но я думаю, что в соответствии с использованием: 1) Передача синглтона в качестве параметра конструктору другого класса может быть допустимой.2) хранение экземпляра синглтона от клиента также может быть допустимым.
МОК может сделать это, например.
Теперь это может быть нежелательно, если вы хотите добавить к getInstance()
некоторую логику: кэширование экземпляров, возвращение различных экземпляров в соответствии с временной шкалой, клиентом и т. Д. Но это действительно хороший способ реализациисинглтон с таким большим количеством логики?Не уверен ...
Это выглядело странно и неловко для меня, и, что еще хуже, я вообще не могу идентифицировать Фу как синглтона в области видимости Бар.
Нообразец синглтона также неуклюж.Если одноэлементный шаблон предоставляет ссылку на экземпляр одноэлементного доступа клиентам, он может использовать его бесплатно.
Почему вы думаете, что, когда вы смотрите на штрих-код, вы должны знать, что Foo является одиночным?
Бар зависит от Foo, потому что он в этом нуждается.Реализация (синглтон или нет) не должна иметь значения на своем уровне.
В общем случае следует избегать «жестко закодированного» одноэлементного шаблона: своего рода глобальной переменной, труднее переключаться на другие реализации, труднее издеваться ...
Если бы вы могли использовать перечисление Java 5это не должно быть сложно реализовать с вашим реальным кодом, это было бы действительно лучше.
Дополнительное примечание для фактического синглтона:
Не является поточно-ориентированным.Использование идиомы Билла Пью сделает это легко.
public class Foo {
private static class Holder{
private static Foo instance = new Foo();
}
private Foo(){}
public static Foo getInstance(){
return Holder.instance();
}
}
Это ленивый экземпляр, как в вашем исходном коде.
Но в общем случае очень важно сэкономить экземпляр, который стоит недорого иобязателен.
Стремительный путь так часто предпочитается:
public class Foo {
private static Foo instance = new Foo();
private Foo(){}
public static Foo getInstance(){
return instance;
}
}