Должен ли родительский класс когда-либо ссылаться на дочерние классы? - PullRequest
3 голосов
/ 29 ноября 2010

Доброе утро,

Я унаследовал некоторый устаревший код на работе, и он использует довольно необычный шаблон проектирования.Единственная ссылка, которую я мог найти на форумах на подобную модель, была здесь .Ситуация такова, что оригинальный конструктор имеет общий родительский класс (не абстрактный), который имеет статический метод фабрики, который напрямую ссылается на дочерние классы.

Вот пример этого стиля кодирования, найденный в нескольких местах вустаревший код:

public static LoggerFactory getLoggerFactory(LogType type) {
    switch (type) {
    case LOG4J:
        return Log4JLoggerFactory.getInstance();
    case LOGBACK:
        return LogBackLoggerFactory.getInstance();
    default:
        throw new RuntimeException("No logger factory defined for type " + type);
    }
}

Где Log4JLoggerFactory и LogBackLoggerFactory расширяют LoggerFactory.

Это кажется мне действительно чуждым, но прежде чем я существенно переформулирую код, есть ли какая-то цель или польза для этого дизайнашаблон (есть даже формальное название для него)?

Любые мысли или советы приветствуются.Спасибо!

РЕДАКТИРОВАТЬ: Прочитав ответ Ишая, я решил добавить ссылку на статью Википедия о шаблоне Стратегии для удобства.Спасибо всем за ваши ответы!

Ответы [ 4 ]

11 голосов
/ 29 ноября 2010

Это очень стандартный шаблон в Java и распространенный способ реализации шаблона стратегии.Вы видите это в стандартном API все время (Календарь против GregorianCalendar, NumberFormat против DecimalFormat и т. Д.).

При этом, когда внедрение зависимостей вызывает всеобщую ярость, такой шаблон действительно может быть заменен навыделенный класс Factory с выделенным интерфейсом Factory, но в отсутствие более широкой причины проектирования, я думаю, что приведенный вами пример - вполне разумный выбор дизайна.

4 голосов
/ 29 ноября 2010

Это хорошая практика и называется Фабричный метод .

Преимущество заключается в том, что вы возвращаете какую-то конкретную реализацию, но скрываете ее через общий интерфейс или базовый класс. Таким образом, клиент не беспокоится о деталях реализации, но работает с самым базовым классом.

0 голосов
/ 29 ноября 2010

Хорошая это или плохая практика, зависит от ситуации. Например, когда «родитель» знает, как создать всех детей, это может быть хорошей практикой. Если родитель этого не знает, это решение вызовет только проблемы.

Еще одна проблема - тестируемость: если у родителя много детей, может быть трудно создать родителя в отрыве от детей, но опять же это зависит.

0 голосов
/ 29 ноября 2010

Может быть, они настроены таким образом, чтобы использовать Log4J в одной среде, а Logback - в другой? Я знаю, что иногда разработчики предпочитают инструмент при локальной разработке, но когда приходит время развертывания, приходится использовать все, что компания одобряет / одобряет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...