java - Java工厂设计模式或工厂类讲解

标签 java factory

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

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

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

最佳答案

工厂的基本思想有两点:

  1. 向用户(开发人员)混淆对象的创建方式
  2. 将所有对象创建都放在一个起始位置。

为什么你首先需要工厂? 那么最简单的答案是您可以控制对象的创建。

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

您想为您的应用程序编写分析。 您很高兴编写一个类来实现您使用的一些分析库。 并检查所有应用程序并编写 AnalyticsEventManager().sendEvent(blabla) 这有什么问题吗?

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

井工厂来救援。

而不是AnalyticsEventManager().sendEvent(blabla)

您编写一个具有“sendEvent”方法的接口(interface)

interface AnalyticEventSender {
   void sendEvent(String eventData); 
}

然后你有一些实现此分析的不同类的实例

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

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

现在您可以编写AnalyticFactory.create().sendEvent(blabla),而不是执行AnalyticEventManager().sendEvent

现在,如果您想检查事件是否实际按照您希望的方式打印,您只需用 TestAnalytic 替换工厂中返回的实例并检查事件是否已打印,而无需实际打印浏览真实的 Facebook 模块。

这对于许多其他应用程序都是如此,而不仅仅是分析。

关于java - Java工厂设计模式或工厂类讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61097417/

相关文章:

PHP:松耦合参数化工厂。是否可以?

具有 Factory 的 Java 库

java - 是否可以根据两个时间戳确定 UTC 偏移量?

java - 静态模拟不起作用

c# - 我应该在工厂模式类中处理异常还是让它们向上传播?

javascript - 如何: Angular Factory method declared in a JavaScript object?

java - 在 OpenCV 中将 32FC3 转换为 8UC3 以将图像另存为 jpg 时出现问题

java - 阻止某些代码在程序流中执行

java - Reactive Mailer - IO 线程上的阻塞操作

angularjs - 从 AngularJS 外部调用工厂