Java 工厂设计模式或工厂 Class 的解释

Explanation of Java Factory Design Pattern or Factory Class

我正在查看 HackerRank,有一个关于工厂设计模式或工厂的快速问题 Class。我正在经历一个基本挑战 (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!!");
        }
     }
    }

我已经花了相当多的时间阅读工厂设计模式的几个在线示例,但我并不十分清楚工厂模式的目的是什么以及它为什么有益或它是什么simplifying/what 正在解决的问题。同样,尝试这个实际示例并没有完全向我阐明问题。

有人可以用非常基本的方式解释一下吗?同样,使用工厂模式的替代方法是什么?也许本练习中提供的这段代码过于简单化了问题,这就是为什么我不清楚工厂完成了什么。感谢您的帮助,因为一些真实世界的颜色会有很大帮助。我已经阅读了各种设计模式并知道它们是什么,但我对这个问题的理解不够充分,因为我对它们的实际经验有限

工厂的基本思想有两点:

  1. 让用户(开发者)混淆对象的创建方式
  2. 将所有对象的创建都放在同一个地方。

为什么首先需要工厂? 嗯,最简单的答案是这样您就可以控制对象的创建。

让我们举一个现实世界的例子:

您想为您的应用编写分析。 您愉快地编写了一个 class 来实现您使用的分析库。 遍历你所有的应用并写下 AnalyticsEventManager().sendEvent(blabla) 这有什么问题?

  1. 有一天你想添加另一个分析或替换 当前一个
  2. 您如何检查您需要的所有地方是否实际调用了分析?

Well 工厂来救援。

而不是AnalyticsEventManager().sendEvent(blabla)

您编写了一个具有 "sendEvent" 方法的接口

interface AnalyticEventSender {
   void sendEvent(String eventData); 
}

然后你有几个不同的 classes 实例来实现这个分析

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);
    }

}

那么你就有了分析工厂

class AnalyticFactory {
   public static AnalyticEventSender create(){
        if(allowFacebookAnalytic){
            return new FacebookAnalytic();
        }else {
            return new TestAnalytic();
        }
   }
}

就像这样,您可以根据某个布尔值替换分析的所有实例(更改分析的原因取决于编写代码的人的判断)

现在你可以写 AnalyticFactory.create().sendEvent(blabla)

而不是 AnalyticEventManager().sendEvent

所以现在,如果您想检查您的事件是否按照您希望的方式打印,您只需将工厂返回的实例替换为 TestAnalytic 并检查事件是否已打印,没有实际通过真正的 facebook 模块。

许多其他应用程序也是如此,而不仅仅是分析。

我建议您阅读 Effective Java,第 3 版,作者 Joshua Bloch,第 1 项。您可以在 Google 中查找它,但其中一个链接是 Effective Java, 3rd Edition