В некоторых случаях нам необходимо предоставить общий ресурс во всем приложении, например, соединение с БД, но мы не хотим
- создавать общий объект заранее (до создания клиентских объектов).
- явно передает общий объект каждому клиентскому объекту.
, тогда мы можем использовать шаблон проектирования Singleton.
Типичный класс Singleton выглядит как
public class MySingleton {
private MySingleton INSTANCE
private MySingleton() {
}
public static MySingleton getInstance() {
if (INSTANCE == null) {
syncronized (MySingleton.class) {
if (INSTANCE == null) {
INSTANCE = new MySingleton();
}
}
}
return INSTANCE;
}
// instance methods exposing business operation
}
Но мы можем добиться аналогичного поведения, создав методы каждого экземпляра, которые представляют бизнес-операции как статические.При таком подходе нам даже не нужно создавать отдельный объект.
Тогда зачем нам нужен синглтон?
Ну, ответ прост.Выделить фактическую реализацию от клиента.В основном мы применяем принцип abstraction OOP здесь.
Это полезно, если класс синглтона является частью библиотеки, которая используется различными клиентами, и библиотека хочет изменить реализацию в соответствии с клиентом.
Пример для такого синглтона может быть
public class MySingleton {
private MySingleton INSTANCE
private MySingleton() {
}
public static MySingleton getInstance() {
if (INSTANCE == null) {
syncronized (MySingleton.class) {
if (INSTANCE == null) {
INSTANCE = new MySingletonChild(); // here we are creating an object of subclass of MySingleton.
}
}
}
return INSTANCE;
}
// instance methods exposing business operation
}
Надеюсь, что это поможет понять шаблон проектирования Singleton.