Паттерн проектирования Factory на примере
Источник:
Medium
Представленное здесь руководство объясняет предназначение паттерна проектирования Factory на конкретном примере кода Java.
![Кофе-брейк #189. Паттерн проектирования Factory на примере. Методы equal() и hashcode() в Java - 1]()
Что такое шаблон (паттерн) проектирования Factory и когда его нужно использовать? Давайте разберемся на примере. По своему опыту в разработке программного обеспечения, если я попытаюсь обобщить, какой шаблон проектирования чаще всего мною использовался, то Factory (фабричный) шаблон войдет в тройку лучших. Когда дело доходит до шаблонов Singleton или Builder, многие библиотеки предоставляют функциональность с помощью аннотаций. Тогда как фабричный шаблон проектирования — единственный, который вы должны реализовать самостоятельно.
Лучше всего понять это можно постановкой задачи на примере. Вот ситуация, когда вам нужно создать службу бронирования номеров в отеле, где есть три типа номеров: обычный номер, номер делюкс и виллы. Исходя из требований заказчика вы должны создать объект в своей программе.
Как мы видим, все три объекта должны расширять один и тот же интерфейс/класс, поскольку они имеют одинаковую функциональность. Итак, создадим интерфейс/класс Room.
class Room {
public string getRoomId();
public float getPrice();
}
Теперь сделаем три класса для каждого типа комнаты.
class NormalRoom extends Room {
private string roomType;
private string roomId;
private float price;
}
class DeluxeRoom extends Room {
private string roomType;
private string roomId;
private float price;
}
class Villa extends Room {
private string roomType;
private string roomId;
private float price;
}
Я не добавляю дополнительные функции в класс, поэтому мы можем сосредоточиться на шаблоне проектирования.
Теперь создадим класс для создания объектов комнат по требованию заказчика. Имя этого класса
RoomFactory. Сначала посмотрите код, затем я поясню.
class RoomFactory {
public static Room getRoom(String roomType) {
switch(roomType){
case 'Normal':
return new NormalRoom();
case 'Deluxe':
return new DeluxRoom();
case 'Villa':
return new Villa();
}
}
}
Это и есть фабричный класс, и я чувствую, что код многое объясняет сам по себе. Здесь у нас есть статический метод, и это единственный метод в этом классе, который принимает на входе строку и в соответствии с ней возвращает объект
Room. Теперь любая библиотека использует этот класс и создает объект для комнаты.
Методы equal() и hashcode() в Java
Источник:
Medium
Благодаря этой публикации вы узнаете о работе методов equal() и hashcode(), а также о способе их переопределения в коде Java.
Метод
equals() в Java используется для определения равенства двух объектов. Он принадлежит к классу
Object, являющемся корнем иерархии классов Java, и наследуется всеми классами Java. Метод
equals() принимает объект в качестве аргумента и возвращает логическое значение, указывающее, равен ли этот объект вызываемому объекту.
Метод
hashCode() используется для возврата значения хеш-кода для объекта. Хэш-код — это числовое значение, которое используется для идентификации объекта в структуре данных на основе хэшей, такой как хэш-таблица. Метод
hashCode() также определен в классе
Object и наследуется всеми классами Java.
Важно переопределить методы
equals() и
hashCode(), если вы хотите использовать свои собственные объекты в качестве ключей в структуре данных на основе хэшей, например в файле
HashMap. Если вы переопределяете метод
equals(), вы также должны переопределить и метод
hashCode(), потому что метод
hashCode() используется для определения местоположения объекта в структуре данных на основе хэша. И если два объекта равны, то они должны иметь одинаковый хеш-код.
Вот пример того, как переопределить
equals() и
hashCode() в классе Java:
public class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Employee)) return false;
Employee e = (Employee) o;
return e.name.equals(name) && e.age == age;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age;
return result;
}
}
В данном примере метод
equals() сравнивает имя и возраст двух объектов
Employee и возвращает значение
true, если они равны. Метод
hashCode() возвращает значение хэш-кода для объекта
Employee на основе его имени и возраста.
А теперь пример того, как вы можете использовать методы
equals() и
hashCode() в своем коде:
Employee e1 = new Employee("John", 30);
Employee e2 = new Employee("John", 30);
System.out.println(e1.equals(e2));
System.out.println(e1.hashCode() == e2.hashCode());
Map<Employee, String> map = new HashMap<>();
map.put(e1, "Employee 1");
map.put(e2, "Employee 2");
System.out.println(map.get(e2));
В показанном выше примере кода метод
equals() используется для сравнения двух объектов
Employee —
e1 и
e2, а метод
hashCode() применяется для добавления их в качестве ключей к
HashMap. Так как метод
equals() считает
e1 и
e2 считается равными друг другу, он рассматривает их как один и тот же ключ и возвращает значение "Employee 1", когда
e2 используется для поиска значения на карте.