Лучше иметь несколько вложенных классов с одинаковой зависимостью или класс с большей областью действия? - PullRequest
0 голосов
/ 05 июля 2019

В моем загрузочном приложении Spring я создаю Фабрику для создания различных объектов с одинаковым интерфейсом и зависимостями, как показано ниже.

@Component
public class FarmFactory {

    @Autowired
    private FarmRepo farmRepo;

    public IFarm create(FarmType type) {
        if (type == type.APPLE) {
            return new AppleFarm(farmRepo);
        } else if (type == type.ANIMAL) {
            return new AnimalFarm(farmRepo);
        } else {
            return new EmptyFarm(farmRepo);
        }
    }
}

Мне было интересно, лучше ли ограничить область действия зависимости FarmRepo, вместо этого внедрив ее в каждый подкласс фермы (apple, animal, empty). Или, если было бы лучше сохранить единственную зависимость в более широкой области действия Фабрики.

В качестве альтернативы, зависимость FarmRepo может быть передана в метод create с типом, но не уверен, каково практическое правило для области зависимости.

Ответы [ 3 ]

0 голосов
/ 06 июля 2019

Я предлагаю создать именованные компоненты ваших реальных реализаций (AppleFarm, AnimalFarm ..) и внедрить FarmRepo. С вашей фабрикой ваши реальные реализации не будут управляться Spring (без bean-компонентов).

@Component("appleFarm")
@RequiredArgsConstructor <- this is a Lombok feature check it out
public class AppleFarm implements Farm {

private final FarmRepo repo;
...
}
0 голосов
/ 06 июля 2019

Я предполагаю, что ваши реализации IFarm являются модельными классами.Не рекомендуется иметь хранилище внутри модели.Вам следует подумать о том, чтобы перенести создание различных реализаций IFarm в FarmRepo.

Если реализации IFarm представляют собой какие-то классы обслуживания, которые управляют бизнес-логикой, то вам следует разрешить Spring обработать их, внедрив в них экземпляр FarmRepo.В этом случае вам лучше рассмотреть возможность использования абстрактного класса, чем использования IFarm, потому что FarmRepo является распространенной зависимостью между ними.

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

0 голосов
/ 05 июля 2019

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

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