среда, 27 августа 2008 г.

1. Используйте статические фабричные методы вместо конструкторо

Вместо конструктора можно использовать статические фабричные методы, как в классах-wrapper'ах, например Integer.valueOf(...)

Отметим, что static factory метод не тоже самое, что шаблон Factory, описываемый метод не имеет прямых аналогов в шаблонах проектирования.

Существует несколько преимуществ такого подхода по сравнению с использованием конструкторов.

Первое преимущество. Можно выбрать "говорящее" имя для static factory метода, что нельзя сделать для конструктора. Выбор имени может улучшить жизнь клиента, его код стоновится более читаемым. К тому же, возможет лишь один конструктор с фиксированным набором параметров, а методов может быть несколько.

Второе преимущество. Принципиальное преимущество заключается в том, что метод не обязан создавать новый экземпляр объекта, он может возвращать ссылку на уже созданный экземпляр, взяв его, например, из кэша. Это позволяет не дублировать экземпляры без необходимости. Такое поведение свойственно методу Boolean.valueOf(boolean). Классы, которые контролируют свои экземпляры подобным образом называют instance-controlled. Есть несколько причин написания instance-controlled классов. Это гарантирует что не существует двух эквивалентных объектов, что позволяет повысить производительность, клиенты могут использовать оператор == вместо equals. Все Enum-ы являются instance-controlled.

Третье преимущество - метод может возвращать экземпляр одного из субклассов, что дает большУю гибкость по сравнению с использование конструктора. Мы можем возврщать экземпляр без объявления класс публичным, т.е. полностью скрывать реализацию, что является ключевым моментом при проектировании компактного API. Интерфейсы не могут иметь статических методов, поэтому принято следующее соглашение. Если интерфейс называется Type, то статические фабричные методы, возвращающие реализации интерфейса, помещаются в класс с именем Types. Подобным образом организован Java Collections Framework. Т.е. все static factory методы сконцентрированы в одном классе и, кроме того, мы скрываем реилизации интерфейса.

Четвертое преимущество. Static factory методы уменьшают количество кода при использованиии generics.

Главный недостаток состоит в том, что нельзя создать субкласс к классу без public или protected конструктора.

Второй недостаток заключается в том, что их, в общем случае, невозможно отличить от других static методов. Обычно прибегают к специальному именованию таких методов:
• valueOf—возвращает объект, содержащий переданный аргумент.
• of—альтернатива valueOf, популярная в Enum-ах.
• getInstance—возвращает экземпляр, который описывается параметрами, но недльзя сказать что имеет тоже самое значение. В случае синглтона возвращает единственный экземпляр.
• newInstance—аналогичен getInstance, но гарантирует создание нового экземпляра.
• getType—аналогичен getInstance, но используется когда factory метод находится в другом классе. Type в данном случае заменяется, например getArrayList.
• newType—аналогичен newInstance.

Вообщем, static factory методы и публичные конструкторы имеют свои области применения.

Комментариев нет: