В об’єктно-орієнтованому програмуванні одиночний клас Java — це клас, який може мати лише один об’єкт (примірник класу) одночасно. Після першого разу, якщо ми спробуємо створити екземпляр класів Java Singleton, нова змінна також вказує на перший створений екземпляр. Тож будь-які модифікації, які ми робимо для будь-якої змінної всередині класу через будь-який екземпляр, впливають на змінну окремого створеного екземпляра та видимі, якщо ми отримуємо доступ до цієї змінної через будь-яку змінну цього типу класу.
Пам’ятайте про ключові моменти під час визначення класу як класу singleton, тобто під час проектування класу singleton:
- Зробіть конструктор приватним.
- Напишіть статичний метод, який має об’єкт типу повернення цього одиночного класу. Тут концепція ледачої ініціалізації використовується для написання цього статичного методу.
Призначення класу Singleton
Основна мета Java-класу Singleton — обмежити кількість створюваних об’єктів лише одним. Це часто гарантує наявність контролю доступу до ресурсів, наприклад, до сокетів або підключення до бази даних.
Втрата пам’яті не відбувається під час використання класу singleton, оскільки він обмежує створення екземплярів. Оскільки створення об’єкта відбуватиметься лише один раз, а не кожного разу, коли надсилається новий запит.
Ми можемо використовувати цей єдиний об’єкт неодноразово відповідно до вимог. Це причина, чому багатопотокові додатки та програми баз даних здебільшого використовують шаблон Singleton у Java для кешування, журналювання, об’єднання потоків, параметрів конфігурації та багато іншого.
Наприклад, у нас є ліцензія, і ми маємо лише одне з’єднання з базою даних або припустимо, що наш драйвер JDBC не дозволяє нам виконувати багатопотоковість, тоді з’являється клас Singleton, який гарантує, що за один раз лише одне з’єднання або один потік може отримати доступ до з'єднання.
Як розробити/створити клас Singleton у Java?
Щоб створити одиночний клас, ми повинні виконати кроки, наведені нижче:
1. Переконайтеся, що існує лише один екземпляр класу.
java pgm
2. Надайте глобальний доступ до цього екземпляра
- Оголошення всіх конструкторів класу приватними.
- Надання статичного методу, який повертає посилання на екземпляр. Концепція відкладеної ініціалізації використовується для написання статичних методів.
- Примірник зберігається як приватна статична змінна.
Прикладом одиночних класів є Клас виконання, сервлет дій і пошук служб . Приватні конструктори та фабричні методи також є прикладом класу singleton.
Різниця між звичайним класом і класом Singleton
Ми можемо відрізнити клас Singleton від звичайних класів щодо процесу створення екземпляра об’єкта класу. Щоб створити екземпляр звичайного класу, ми використовуємо конструктор Java. З іншого боку, щоб створити екземпляр класу singleton, ми використовуємо метод getInstance().
Інша відмінність полягає в тому, що звичайний клас зникає в кінці життєвого циклу програми, тоді як клас singleton не знищується після завершення програми.
Форми шаблону класу Singleton
Існує дві форми однотонних шаблонів проектування, а саме:
вказівники в c
- Рання інстанція: Створення об'єкта відбувається під час завантаження.
- Ледачий екземпляр: Створення об'єкта виконується відповідно до вимоги.
Реалізація: Давайте коротко розповімо, чим одиночний клас відрізняється від звичайного класу в Java. Тут різниця полягає в створенні екземплярів, оскільки для звичайного класу ми використовуємо конструктор, тоді як для класу singleton ми використовуємо метод getInstance(). який ми розглянемо в прикладі 1, як показано нижче. Загалом, щоб уникнути плутанини, ми також можемо використовувати назву класу як назву методу під час визначення цього методу, який буде зображений у прикладі 2 нижче, як показано нижче.
Приклад 1:
Java
// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> > // Static variable reference of single_instance> > // of type Singleton> > private> static> Singleton single_instance => null> ;> > // Declaring a variable of type String> > public> String s;> > // Constructor> > // Here we will be creating private constructor> > // restricted to this class itself> > private> Singleton()> > {> > s => 'Hello I am a string part of Singleton class'> ;> > }> > // Static method> > // Static method to create instance of Singleton class> > public> static> synchronized> Singleton getInstance()> > {> > if> (single_instance ==> null> )> > single_instance => new> Singleton();> > return> single_instance;> > }> }> // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Instantiating Singleton class with variable x> > Singleton x = Singleton.getInstance();> > // Instantiating Singleton class with variable y> > Singleton y = Singleton.getInstance();> > // Instantiating Singleton class with variable z> > Singleton z = Singleton.getInstance();> > // Printing the hash code for above variable as> > // declared> > System.out.println(> 'Hashcode of x is '> > + x.hashCode());> > System.out.println(> 'Hashcode of y is '> > + y.hashCode());> > System.out.println(> 'Hashcode of z is '> > + z.hashCode());> > // Condition check> > if> (x == y && y == z) {> > // Print statement> > System.out.println(> > 'Three objects point to the same memory location on the heap i.e, to the same object'> );> > }> > else> {> > // Print statement> > System.out.println(> > 'Three objects DO NOT point to the same memory location on the heap'> );> > }> > }> }> |
>
>Вихід
Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>
Пояснення результату:
У класі singleton, коли ми вперше викликаємо метод getInstance(). , він створює об’єкт класу з іменем single_instance і повертає його до змінної. Оскільки single_instance є статичним, він змінюється з null на деякий об’єкт. Наступного разу, якщо ми спробуємо викликати метод getInstance(), оскільки single_instance не є нульовим, він повертається до змінної замість того, щоб знову створювати екземпляр класу Singleton. Ця частина виконується умовою if.
У основному класі ми створюємо екземпляр класу singleton із 3 об’єктами x, y та z, викликаючи static метод getInstance() . Але насправді після створення об’єкта x змінні y і z вказують на об’єкт x, як показано на діаграмі. Отже, якщо ми змінюємо змінні об’єкта x, це відображається, коли ми отримуємо доступ до змінних об’єктів y і z. Крім того, якщо ми змінюємо змінні об’єкта z, це відображається, коли ми отримуємо доступ до змінних об’єктів x і y.
об'єктивна java
Тепер ми закінчили з охопленням усіх аспектів прикладу 1 і реалізували те саме, тепер ми будемо реалізовувати клас Singleton з назвою методу, як ім’я класу.
приклад 2:
Java
перетворення рядка в ціле число в java
// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> > // Static variable single_instance of type Singleton> > private> static> Singleton single_instance => null> ;> > // Declaring a variable of type String> > public> String s;> > // Constructor of this class> > // Here private constructor is used to> > // restricted to this class itself> > private> Singleton()> > {> > s => 'Hello I am a string part of Singleton class'> ;> > }> > // Method> > // Static method to create instance of Singleton class> > public> static> Singleton Singleton()> > {> > // To ensure only one instance is created> > if> (single_instance ==> null> ) {> > single_instance => new> Singleton();> > }> > return> single_instance;> > }> }> // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Instantiating Singleton class with variable x> > Singleton x = Singleton.Singleton();> > // Instantiating Singleton class with variable y> > Singleton y = Singleton.Singleton();> > // instantiating Singleton class with variable z> > Singleton z = Singleton.Singleton();> > // Now changing variable of instance x> > // via toUpperCase() method> > x.s = (x.s).toUpperCase();> > // Print and display commands> > System.out.println(> 'String from x is '> + x.s);> > System.out.println(> 'String from y is '> + y.s);> > System.out.println(> 'String from z is '> + z.s);> > System.out.println(> '
'> );> > // Now again changing variable of instance z> > z.s = (z.s).toLowerCase();> > System.out.println(> 'String from x is '> + x.s);> > System.out.println(> 'String from y is '> + y.s);> > System.out.println(> 'String from z is '> + z.s);> > }> }> |
>
>Вихід
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>
Пояснення: У класі singleton, коли ми вперше викликаємо метод Singleton(), він створює об’єкт класу Singleton з іменем single_instance і повертає його до змінної. Оскільки single_instance є статичним, він змінюється з null на деякий об’єкт. Наступного разу, якщо ми спробуємо викликати метод Singleton(), оскільки single_instance не є нульовим, він повертається до змінної замість того, щоб знову створити екземпляр класу Singleton.
Детальніше: Підручник із шаблонів проектування Java