Синглтоны плохие, если вы их развиваете. Если вы используете внедрение зависимостей, позвольте контейнеру DI обрабатывать одноэлементную природу вашего объекта Service. Если вы не используете внедрение зависимостей, используйте статический метод вместо одиночного.
Классический пример плохого:
public class HootUtility // singleton because developer was a goofball.
{
...
public void blammy(...) { ... }
public HootUtility getInstance() { ... }
}
... somewhere in the code.
HootUtility.getInstance().blammy(...); // This is silly.
Лучшая реализация вышеперечисленного:
public class HootUtility // Not a singleton because I am not a ______. (fill in the blank as you see fit)
{
// You can limit instantiation but never prevent instantiation.
// google "java reflection" for details.
private HootUtility()
{
throw new UnsuppotedOperationException();
}
public static void blammy(...) { ... }
}
... somewhere in the code.
HootUtility.blammy(...);
Если у вас есть интерфейс службы, который имеет конкретную реализацию, используйте инфраструктуру внедрения зависимостей для внедрения реализации (структуры DI включают: spring и guice).
Редактировать: Если бы я использовал пружину, я бы выбрал одноэлементную область (по умолчанию).