我正在浏览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!!");
}
}
}我花了相当多的时间在网上阅读了几个工厂设计模式的例子,但我不太清楚工厂模式的目的是什么,为什么它是有益的,或者它简化了什么/它正在解决什么问题。同样,尝试这个实际的例子也没有向我说明这个问题。
有人能用一种非常基本的方式解释这一点吗?类似地,使用工厂模式的替代方案是什么?也许这个练习中提供的代码过于简化了这个问题,这就是为什么我不清楚Factory完成了什么。谢谢你的帮助,因为一些真实世界的颜色会有很大帮助。我读过关于各种设计模式的文章,并且知道它们是什么,但是我不太了解这个问题,因为它们在现实世界中的经验有限。
发布于 2020-04-08 09:44:09
工厂的基本理念有两样东西:
你为什么一开始就需要这个工厂?最简单的答案是,这样你就可以控制对象的创建。
让我们以一个真实的世界为例:
你想为你的应用程序写一个分析软件。您很高兴地编写了一个类,它实现了一些用于分析的库。然后浏览你所有的应用程序并编写AnalyticsEventManager().sendEvent(blabla),这有什么问题吗?
工厂去营救。
而不是AnalyticsEventManager().sendEvent(blabla)
您可以编写具有"sendEvent"方法的接口。
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();
}
}
}因此,就像您能够根据某个布尔值替换分析的所有实例一样(更改分析的原因取决于编写代码的人的酌处性)。
现在,您将不再执行AnalyticEventManager().sendEvent,而是编写AnalyticFactory.create().sendEvent(blabla)
所以现在,如果您想检查您的事件是否按照您希望的方式打印,您只需用TestAnalytic替换在工厂中返回的实例,并检查事件是否打印,而不需要真正的facebook模块。
对于许多其他应用程序来说,这是事实,而不仅仅是分析。
发布于 2020-04-08 11:02:25
我建议你阅读有效的Java,第3版,由乔舒亚布洛赫,第1项。你可以在谷歌查找,但其中一个链接是有效Java,第3版。
https://stackoverflow.com/questions/61097417
复制相似问题