Объяснение Java Фабричный шаблон проектирования или Фабричный класс - PullRequest
0 голосов
/ 08 апреля 2020

Я прохожу через HackerRank, и у меня был быстрый вопрос относительно шаблона дизайна фабрики или класса фабрики. Я прошёл базовый c вызов (https://www.hackerrank.com/challenges/java-factory/problem) и смог его решить (код показан ниже). Я написал часть кода, которая указана в комментариях ниже, а остальное было предоставлено.

import java.util.*;
import java.security.*;
interface Food {
     public String getType();
    }
    class Pizza implements Food {
     public String getType() {
     return "Someone ordered a Fast Food!";
     }
    }
//I implemented the part starting here    
        class Cake implements Food {

         public String getType() {
         return "Someone ordered a Dessert!";
         }
        }

    class FoodFactory {
        public Food getFood(String order) {

if (order.equalsIgnoreCase("Pizza")){
        return new Pizza();}

else return new Cake();

}//End of getFood method; this is the end of the part I implemented

    }//End of factory class

    public class Solution {

     public static void main(String args[]){
            Do_Not_Terminate.forbidExit();

        try{

            Scanner sc=new Scanner(System.in);
            //creating the factory
            FoodFactory foodFactory = new FoodFactory();

            //factory instantiates an object
            Food food = foodFactory.getFood(sc.nextLine());


            System.out.println("The factory returned "+food.getClass());
            System.out.println(food.getType());
        }
        catch (Do_Not_Terminate.ExitTrappedException e) {
            System.out.println("Unsuccessful Termination!!");
        }
     }
    }

Я потратил довольно много времени, читая в Интернете несколько примеров шаблона фабричного дизайна, но мне не совсем ясно, какова цель фабричного шаблона и почему он полезен или что это упрощает / какую проблему это решает. Точно так же попытка этого фактического примера не совсем выяснила проблему для меня.

Может ли кто-нибудь объяснить это очень основательно c способом и аналогичным образом, какие будут альтернативы использованию фабричного шаблона? Возможно, этот код, представленный в этом упражнении, упрощает проблему, и поэтому мне не ясно, чего добилась Фабрика. Спасибо за некоторую помощь, так как некоторые цвета в реальном мире очень помогли бы. Я читал о различных шаблонах проектирования и знаю, что это такое, но я недостаточно хорошо понимаю проблему, имея ограниченный опыт работы с ними

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Базовая c идея фабрики состоит из 2 вещей:

  1. Запутывает пользователя (разработчика), как создаются объекты
  2. Поместите все объекты создания через один Место происхождения.

Зачем вам фабрика в первую очередь? Ну, самый простой ответ - чтобы вы могли контролировать создание объекта.

Давайте рассмотрим пример из реального мира:

Вы хотите написать аналитику для своего приложения. Вы с радостью пишете класс, который реализует некоторую библиотеку для аналитики, которую вы используете. И go поверх всего вашего приложения и напишите AnalyticsEventManager().sendEvent(blabla) В чем проблема с этим?

  1. Настал день, когда вы хотите добавить другой аналитик c или заменить текущий
  2. Как вы проверяете, что все места, в которых вы нуждаетесь в аналитике 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.

Это верно для множество других приложений, а не только аналитика.

1 голос
/ 08 апреля 2020

Предлагаю вам прочитать Effective Java, 3-е издание, Джошуа Блоха, пункт 1. Вы можете посмотреть его в Google, но одна из ссылок - Effective Java, 3-е издание .

...