首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java工厂设计模式或工厂类的解释

Java工厂设计模式或工厂类的解释
EN

Stack Overflow用户
提问于 2020-04-08 09:26:53
回答 2查看 455关注 0票数 0

我正在浏览HackerRank,并对工厂设计模式或工厂类提出了一个快速的问题。我正在经历一个基本的挑战(https://www.hackerrank.com/challenges/java-factory/problem),并且能够解决它(如下所示的代码)。我编写了代码中由下面的注释所指示的部分,而其余部分则是提供的。

代码语言:javascript
复制
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!!");
        }
     }
    }

我花了相当多的时间在网上阅读了几个工厂设计模式的例子,但我不太清楚工厂模式的目的是什么,为什么它是有益的,或者它简化了什么/它正在解决什么问题。同样,尝试这个实际的例子也没有向我说明这个问题。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-08 09:44:09

工厂的基本理念有两样东西:

  1. 混淆用户(开发人员)如何创建对象
  2. 把所有的物体创造通过一个单一的起源地。

你为什么一开始就需要这个工厂?最简单的答案是,这样你就可以控制对象的创建。

让我们以一个真实的世界为例:

你想为你的应用程序写一个分析软件。您很高兴地编写了一个类,它实现了一些用于分析的库。然后浏览你所有的应用程序并编写AnalyticsEventManager().sendEvent(blabla),这有什么问题吗?

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

工厂去营救。

而不是AnalyticsEventManager().sendEvent(blabla)

您可以编写具有"sendEvent"方法的接口。

代码语言:javascript
复制
interface AnalyticEventSender {
   void sendEvent(String eventData); 
}

然后有几个不同类的实例,它们实现了这个分析。

代码语言:javascript
复制
class FacebookAnalytic implements AnalyticEventSender {
    @Override
    public void sendEvent(String eventData){
       System.out.println("I am facebook analytics sender:" + eventData);
    }
}

那你就有

代码语言:javascript
复制
class TestAnalytic implements AnalyticEventSender {
    @Override
    public void sendEvent(String eventData){
       System.out.println("I am test analytics sender:"+eventData);
    }

}

那你就有了分析工厂

代码语言:javascript
复制
class AnalyticFactory {
   public static AnalyticEventSender create(){
        if(allowFacebookAnalytic){
            return new FacebookAnalytic();
        }else {
            return new TestAnalytic();
        }
   }
}

因此,就像您能够根据某个布尔值替换分析的所有实例一样(更改分析的原因取决于编写代码的人的酌处性)。

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

所以现在,如果您想检查您的事件是否按照您希望的方式打印,您只需用TestAnalytic替换在工厂中返回的实例,并检查事件是否打印,而不需要真正的facebook模块。

对于许多其他应用程序来说,这是事实,而不仅仅是分析。

票数 2
EN

Stack Overflow用户

发布于 2020-04-08 11:02:25

我建议你阅读有效的Java,第3版,由乔舒亚布洛赫,第1项。你可以在谷歌查找,但其中一个链接是有效Java,第3版

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61097417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档