Привіт усім, codeGym!
Розповім сьогодні про патерн проектування
Singleton
(одинак).
Мета: створити клас, який матиме лише ОДИН об'єкт. Це означає, що скільки б разів до нього не зверталися, повертатиметься той самий об'єкт, який був створений вперше. Це зручна річ і необхідна у багатьох місцях, недаремно її впроваджують у фреймворки.
Застосування:
- Наприклад, необхідно підключити базу даних до проекту та класу, який відповідатиме за з'єднання з нею. Один раз створюється з'єднання і немає потрібно створювати його знову і знову
Application settings
— клас, що відповідає за налаштування зброї, які потрібні для застосування: хост і порт бази даних і т.д. Вони створюються один раз і використовуються весь час роботи програми.
- є ще безліч прикладів, про які я не сказав, тому пишіть у коментарях свої варіанти! =)
Після цього вступу, як я розумію, можна показати вже приклад цього класу: (Хоча я впевнений, що кожен з нас зможе придумати реалізацію цього) Ось найпростіший приклад, коли ми ставимо приватним конструктором, тобто. не можна створювати об'єкт. І є статичний метод
getInstance()
, який надає об'єкт.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Є проблеми з багатопоточністю і тоді можна поставити метод
getInstance()
маркер
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Насамкінець, як завжди, хочу сказати, що якщо ви думаєте інакше або знайшли у мене помилку — пишіть у коментарях! Ми всі обговоримо, із задоволенням :) Якщо Вам сподобалася стаття, пишіть "+" і я це знатиму. Це для мене важливо :) PS Додаю ще реалізації: На думку
Joshua Bloch 'а це найкращий спосіб реалізації шаблону
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
І ще
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
Лінива ініціалізація
+
Висока продуктивність
-
Неможливо використовувати для нестатичних полів класу Будуть запитання/пропозиції — пишіть у коментарі!
також мої інші статті:
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ