Какие порождающие паттерны программирования существуют
Что проверяют
Знаете ли вы пять порождающих паттернов из каталога GoF и, главное, узнаёте ли их в JDK и Spring, а не только в учебных примерах. Следом почти всегда просят написать потокобезопасный Singleton или объяснить, чем Factory Method отличается от Abstract Factory.
Как отвечать
Назовите пятёрку и к каждому дайте пример из реального Java-кода:
- Singleton: один экземпляр на приложение. Надёжные реализации в Java:
enumс одним элементом (защищён от рефлексии и сериализации) или идиома Initialization-on-demand holder с ленивой инициализацией. Double-checked locking работает только сvolatileполем; - Factory Method: создание объекта делегируется методу, который подкласс может переопределить. Близкий родственник, статический фабричный метод, встречается повсюду:
List.of(),Optional.of(),Calendar.getInstance(); - Abstract Factory: интерфейс для создания семейства связанных объектов. Пример из JDK:
DocumentBuilderFactoryвыдаёт реализацию парсера, не раскрывая её класс; - Builder: пошаговая сборка объекта с множеством необязательных параметров вместо «телескопических» конструкторов. Примеры:
HttpRequest.newBuilder(),StringBuilder,@Builderиз Lombok; - Prototype: создание копии существующего объекта. Формально через
Cloneableиclone(), но на практике чаще используют конструктор копирования или метод вродеcopyOf.
Сильный ход: сказать, что в Spring-приложении большую часть этих задач берёт на себя контейнер. Бины по умолчанию имеют scope singleton (один экземпляр на контекст, а не на JVM), а методы с @Bean по сути фабрики. Поэтому вручную Singleton сейчас пишут редко.
Где спотыкаются
Пишут Singleton с ленивой инициализацией без синхронизации или без volatile и не видят гонки. Второй поток может получить второй экземпляр или недостроенный объект.
Путают Factory Method со статическим фабричным методом. Первый это паттерн, построенный на наследовании, второй просто приём, описанный у Блоха в Effective Java.
Хвалят clone() без оговорок. Он делает поверхностную копию, вложенные коллекции остаются общими, а сам контракт Cloneable давно считается неудачным.