Базовая c идея фабрики состоит из 2 вещей:
- Запутывает пользователя (разработчика), как создаются объекты
- Поместите все объекты создания через один Место происхождения.
Зачем вам фабрика в первую очередь? Ну, самый простой ответ - чтобы вы могли контролировать создание объекта.
Давайте рассмотрим пример из реального мира:
Вы хотите написать аналитику для своего приложения. Вы с радостью пишете класс, который реализует некоторую библиотеку для аналитики, которую вы используете. И go поверх всего вашего приложения и напишите AnalyticsEventManager().sendEvent(blabla)
В чем проблема с этим?
- Настал день, когда вы хотите добавить другой аналитик c или заменить текущий
- Как вы проверяете, что все места, в которых вы нуждаетесь в аналитике c, на самом деле он вызывается?
На заводе спасение скважин.
вместо AnalyticsEventManager().sendEvent(blabla)
Вы пишете интерфейс, который имеет "sendEvent"
метод
interface AnalyticEventSender {
void sendEvent(String eventData);
}
Затем у вас есть несколько экземпляров различных классов, которые реализуют эту аналитику c
class FacebookAnalytic implements AnalyticEventSender {
@Override
public void sendEvent(String eventData){
System.out.println("I am facebook analytics sender:" + eventData);
}
}
Тогда у вас есть
class TestAnalytic implements AnalyticEventSender {
@Override
public void sendEvent(String eventData){
System.out.println("I am test analytics sender:"+eventData);
}
}
Тогда у вас есть аналити c фабрика
class AnalyticFactory {
public static AnalyticEventSender create(){
if(allowFacebookAnalytic){
return new FacebookAnalytic();
}else {
return new TestAnalytic();
}
}
}
и так же, как вы смогли заменить ВСЕ экземпляры вашего аналитика c на основе для некоторого логического значения (причина изменения аналитики c зависит от усмотрения того, кто написал код)
И теперь вместо AnalyticEventManager().sendEvent
вы бы написали AnalyticFactory.create().sendEvent(blabla)
Итак, теперь, если вы хотите проверить, что ваши события напечатаны так, как вы хотите Чтобы их напечатать, вы просто заменяете экземпляр, возвращенный на заводе, на TestAnalyti c и проверяете, что события печатаются, фактически не проходя через настоящий модуль facebook.
Это верно для множество других приложений, а не только аналитика.