Паттерны Singleton и Null object

Паттерны Singleton и Null object

Всем привет. Этот урок является частью цикла статей о паттернах проектирования. Пример кода расположен по ссылке.

Singleton

Паттерн Singleton используется в тех случаях, в которых вы хотите ограничить экземпляр класса только одним объектом.

Класс не должен требовать параметры для построения. Если создание класса требует значительных ресурсов, то Singleton является подходящим решением. Довольно удобно, когда объект создается до того, когда его нужно использовать в других классах.

Паттерн Null object

Идея состоит в том, чтобы сделать код более простым и безопасным, допуская проверки на предмет равенства объекта null:

Null object позволяет смело вызывать созданные методы проверки  на предмет равенства null без использования исключения NullRefferenceException. Этот паттерн очень хорошо сочетается с Singleton, где объектом, равным null, может быть сам объект Singleton

Пример

Наиболее частое использование Singleton – ограничение WebDriver до одного экземпляра объекта на весь проект.

Я собираюсь показать несколько иной пример, где Singleton используется вместе с паттерном Null object. NullWebElement реализует интерфейс IWebElement, поэтому он должен реализовать все методы и свойства, определенные интерфейсом. Это сделано в строках 4 – 21. Свойства возвращают некоторые значений, но не нулевые! Методы ничего не делают. Singleton реализуется в строках 23 - 36. Если объект Singleton не равен null, то только в этом случае создается объект.

Есть два основных преимущества кода выше. Первое преимущество само использование паттерна Null object. Вы можете найти элемент, который еще не существует, и вызвать его методы в тестах и при этом они не упадут.

На проверку равенства null выделяется какое-то время. И может возникнуть логичный вопрос,- стоит ли вообще использовать такую проверку. Мое мнение следующее, – делать проверку нужно. Реальная выгода заключается в том, что вы будете иметь только один неудачный тест вместо проваленного рана всех тестов.

Второе преимущество приходит от паттерна Singleton. Вы можете легко сравнить любой элемент с конструкцией NullWebElement.NULL. Скорее всего, вы найдете элемент и безопасно его используете благодаря паттерну Null object.

Таким образом, Singleton обязателен для изучения. Null object в комбинации с Singleton может уменьшить количество кода, особенно при написании больших проектов.