- Java Singleton Class
- Purpose of Singleton Class
- How to Design/Create a Singleton Class in Java?
- Difference between Normal Class and Singleton Class
- Forms of Singleton Class Pattern
- Java
- Паттерны и Singleton – для всех, кто впервые с ними столкнулся
- Что вообще такое паттерн
- Зачем нужны паттерны (шаблоны проектирования)
- Наконец-то паттерн Singleton
Java Singleton Class
In object-oriented programming, a java singleton class is a class that can have only one object (an instance of the class) at a time. After the first time, if we try to instantiate the Java Singleton classes, the new variable also points to the first instance created. So whatever modifications we do to any variable inside the class through any instance, affects the variable of the single instance created and is visible if we access that variable through any variable of that class type defined.
Remember the key points while defining a class as a singleton class that is while designing a singleton class:
- Make a constructor private.
- Write a static method that has the return type object of this singleton class. Here, the concept of Lazy initialization is used to write this static method.
Purpose of Singleton Class
The primary purpose of a java Singleton class is to restrict the limit of the number of object creations to only one. This often ensures that there is access control to resources, for example, socket or database connection.
Memory space wastage does not occur with the use of the singleton class because it restricts instance creation. As the object creation will take place only once instead of creating it each time a new request is made.
We can use this single object repeatedly as per the requirements. This is the reason why multi-threaded and database applications mostly make use of the Singleton pattern in Java for caching, logging, thread pooling, configuration settings, and much more.
For example, there is a license with us, and we have only one database connection or suppose our JDBC driver does not allow us to do multithreading, then the Singleton class comes into the picture and makes sure that at a time, only a single connection or a single thread can access the connection.
How to Design/Create a Singleton Class in Java?
To create a singleton class, we must follow the steps, given below:
1. Ensure that only one instance of the class exists.
2. Provide global access to that instance by
- Declaring all constructors of the class to be private.
- Providing a static method that returns a reference to the instance. The lazy initialization concept is used to write the static methods.
- The instance is stored as a private static variable.
Example of singleton classes is Runtime class, Action Servlet, and Service Locator. Private constructors and factory methods are also an example of the singleton class.
Difference between Normal Class and Singleton Class
We can distinguish a Singleton class from the usual classes with respect to the process of instantiating the object of the class. To instantiate a normal class, we use a java constructor. On the other hand, to instantiate a singleton class, we use the getInstance() method.
The other difference is that a normal class vanishes at the end of the lifecycle of the application while the singleton class does not destroy with the completion of an application.
Forms of Singleton Class Pattern
There are two forms of singleton design patterns, which are:
- Early Instantiation: The object creation takes place at the load time.
- Lazy Instantiation: The object creation is done according to the requirement.
Implementation: Let us briefly how the singleton class varies from the normal class in java. Here the difference is in terms of instantiation as for normal class we use a constructor, whereas for singleton class we use the getInstance() method which we will be peeking out in example 1 as depicted below. In general, in order to avoid confusion, we may also use the class name as the method name while defining this method which will be depicted in example 2 below as follows.
Java
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
Output Explanation:
In a singleton class, when we first-time call the getInstance() method, it creates an object of the class with the name single_instance and returns it to the variable. Since single_instance is static, it is changed from null to some object. Next time, if we try to call the getInstance() method since single_instance is not null, it is returned to the variable, instead of instantiating the Singleton class again. This part is done by if condition.
In the main class, we instantiate the singleton class with 3 objects x, y, and z by calling the static method getInstance(). But actually, after the creation of object x, variables y and z are pointed to object x as shown in the diagram. Hence, if we change the variables of object x, that is reflected when we access the variables of objects y and z. Also if we change the variables of object z, that is reflected when we access the variables of objects x and y.
Now we are done with covering all aspects of example 1 and have implemented the same, now we will be implementing the Singleton class with the method name as that of the class name.
Паттерны и Singleton – для всех, кто впервые с ними столкнулся
Данная статья ориентирована на тех, кто впервые столкнулся с понятием паттернов, услышал о Singleton ’e, либо каким-то образом его сделал, но так ничего и не поняли. Welcome! Впервые с паттернами студенты JavaRush сталкиваются на 15 уровне, когда неожиданным образом кэп просит “закрепить” и реализовать паттерн Singleton с ленивой реализацией. У студентов, впервые услышавших про Singleton , мгновенно возникает куча вопросов: что вообще такое паттерн, зачем он нужен, какой еще Singleton и наконец, что еще за ленивая реализация. Начнем отвечать по-порядку:
Что вообще такое паттерн
Отвечать на этот вопрос для лучшего понимания, полагаю, стоит с истории. Среди программистов есть такая знаменитая четверка авторов: Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес, которым пришла в голову интересная мысль.
Они заметили, что при написании программ им часто приходится решать приблизительно одни и те же задачи, и писать по структуре однотипный код. Поэтому они решили описать в виде паттернов типовые шаблоны, которые часто приходится использовать в объектно-ориентированном программировании. Книга вышла в 1995 году под названием «Приемы объектно-ориентированного проектирования. Паттерны проектирования» . Название книги оказалось слишком длинным, и ее просто стали называть «Книгой банды четырех». В первом издании было опубликовано 23 паттерна, после чего были открыты и десятки других. Так вот, отвечая на вопрос этого параграфа, — «Что же такое паттерны», подытожим буквально в нескольких словах:
Зачем нужны паттерны (шаблоны проектирования)
Программировать получается и без знания паттернов, убедиться в этом можно просто осознав тот факт, что к 15-му уровню на JavaRush вы написали сотни мини-программ, ничего не зная об их существовании. Это говорит о том, что паттерн – это своего рода инструмент, наличие которого и отличает мастера от любителя:
В паттернах описывается, как правильно следует решать одну из типовых задач. Как следствие, знание паттернов экономит ваше время. Можно привести аналогию с алгоритмами. К примеру, можно придумывать «свой» алгоритм сортировки с блекджеком и цифрами и потратить на это много времени, а можно использовать уже давно описанный и реализовать его. То же самое и с паттернами. Плюс ко всему, с использованием паттернов код становится более стандартизирован, а при использовании нужных шаблонов у вас будет меньше вероятности сделать ошибки, так как их уже давно предвидели и устранили в этом паттернте. Ну и плюс ко всему, знание паттернов позволяет программистам лучше понимать друг друга. Достаточно просто произнести название шаблона, вместо того, чтобы пытаться объяснить своим коллегам-программистам, чего вы от них хотите. Итак, подытожим, шаблоны проектирования помогают:
- не изобретать велосипед, а использовать стандартные решения;
- стандартизировать код;
- стандартизировать терминологию;
В заключении этого раздела отметим, что все многообразие паттернов можно упрощенно разбить на три большие группы:
Наконец-то паттерн Singleton
- когда в вашей программе должно быть создано не более одного объекта какого-либо класса. Например, в компьютерной игре у вас есть класс «Персонаж», и у этого класса должен быть только один объект описывающий самого персонажа.
- когда требуется предоставить глобальную точку доступа к объекту класса. Другими словами, нужно сделать так, чтобы объект вызывался из любого места программы. И, увы, для этого не достаточно просто создать глобальную переменную, ведь она не защищена от записи и кто угодно может изменить значение этой переменной и глобальная точка доступа к объекту будет потеряна. Это свойства Singleton ‘a нужно, например, когда у вас есть объект класса, который работает с базой данных, и вам нужно чтобы к базе данных был доступ из разных частей программы. А Singleton будет гарантировать, что никакой другой код не заменил созданный ранее экземпляр класса.
Внимательно прочитав условие, становится понятно, зачем здесь нужен именно Singleton (Одиночка). Ведь в программе просят создать по одному объекту каждого класса: Sun , Moon , Earth . И логично предположить, что каждый класс в программе должен создавать не больше одного Солнца/Луны/Земли, иначе это будет абсурд, если конечно вы не пишите свою версию звездных воин. Особенность реализации Singleton в Java за три шага Поведение Одиночки на Java невозможно реализовать с помощью обычного конструктора, потому что конструктор всегда возвращает новый объект. Поэтому все реализации Singleton ’a сводятся к тому, чтобы скрыть конструктор и создать публичный статический метод, который будет управлять существованием объекта-одиночки и «уничтожать» всех вновь-появляющихся объектов. В случае вызова Singleton ’a он должен либо создать новый объект (если его еще нет в программе), либо вернуть уже созданный. Для этого: #1. – Нужно добавить в класс приватное статическое поле, содержащее одиночный объект:
public class LazyInitializedSingleton < private static LazyInitializedSingleton instance; //#1 >
#2. – Сделать конструктор класса (конструктор по-умолчанию) приватным (чтобы доступ к нему был закрыть за пределами класса, тогда он не сможет возвращать новые объекты):
public class LazyInitializedSingleton < private static LazyInitializedSingleton instance; private LazyInitializedSingleton()<>// #2 >
#3. – Объявить статический создающий метод, который будет использоваться для получения одиночки:
public class LazyInitializedSingleton < private static LazyInitializedSingleton instance; private LazyInitializedSingleton()<>public static LazyInitializedSingleton getInstance() < // #3 if(instance == null)< //если объект еще не создан instance = new LazyInitializedSingleton(); //создать новый объект >return instance; // вернуть ранее созданный объект > >