我有一个问题,在一次采访中,我有两种食物,比如面包和蛋糕,给出了以下内容:
public class FoodFactory{};
public class Food{};
public static void main(String[] args) {
Food foo = FoodFactory.get("bread");
System.out.println(foo.getClass().getName());
}
鉴于FoodFactory
类和Food
类,我不确定如何使这项工作能够打印出"bread"
类。看起来打印面包的唯一方法就是创建一个Bread
类并让FoodFactory
返回。
我只是想知道我是否遗漏了任何东西,因为FoodFactory
和Food
是给出的类,所以我认为那些是我需要改变的唯一两个类。有没有办法实现给定的两个类,并在仅使用这两个类时打印"bread"
?
答案 0 :(得分:2)
所以一种方法是创建一个类Bread
,它扩展类Food
并让FoodFactory.get()
根据传递的字符串返回适当的对象。
class Food {};
class Bread extends Food {};
class FoodFactory {
public static Food get(String type){
switch(type){
case "bread" : return new Bread();
default : return new Food();
}
}
}
另一种方法是使用反射。
答案 1 :(得分:0)
除非你在运行时编译一个新类(这可能,但在这里不合适),如果你想返回一个<ul id="gallery">
<li>
**Project thumbnail and description here. Multiple list-items showing other projects below**
</li>`
</ul>
#gallery {
list-style: none;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
flex-direction: column;
-webkit-flex-direction: column;
margin: 0 auto;
padding: 0 5%;
padding-top: 2.5%;
flex-wrap: wrap;
-webkit-flex-wrap: wrap;}
@media all and (min-width: 769px) {
#gallery {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
flex-direction: row;
-webkit-flex-direction: row;}
实例,你当然需要添加一个类。
答案 2 :(得分:0)
理想情况下,Food
应该最多变成一个接口或一个抽象类。然后,您可以使用Bread
和Cake
类来实现/扩展Food
。您的FoodFactory
有一个静态方法get
,它接受食物作为字符串。根据值,您实例化并返回一个具体类,它将为您提供打印类名时所需的内容。
答案 3 :(得分:0)
我认为面试官提出的真正问题是你是否了解模式和多态性。正如其中一条评论所述getClass().getName()
将不会返回'Bread',除非确实存在Bread类。您可以做的是建议采访者Food
是基类,在这种情况下应该由Cake
和Bread
类扩展,或者甚至建议将其更改为摘要类或接口。然后你可以提出一个简单的工厂类,它将在基类接口后面创建所需的“隐藏”实现。
答案 4 :(得分:0)
您的问题基本上是Java Factory Design Pattern的一个示例。 假设你有一个项目,分别是一个具有多个接口和不同类的类层次结构,那么创建任何类的最简单方法是什么?这是工厂到位处理有关类实例创建的所有操作的地方。
现在,您可以方便地将Class Food
更改为界面,例如:
public interface Food {
String getType();
}
现在您需要实现Cake
Bread
和interface Food
个类
public class Cake implements Food{
@Override
public String getType() {
return "Cake";
}
}
public class Bread implements Food{
@Override
public String getType() {
return "Bread";
}
}
现在您需要定义具有静态FoodFactory
方法的get
类,该方法根据提供的条件返回Food
。
public class FoodFactory {
public static Food get(String classifier){
if(classifier.equals("Cake")) return new Cake();
if(classifier.equals("Bread")) return new Bread();
//no matching Food to create
throw new IllegalArgumentException("The " + classifier + " is not a valid classifier");
}
}
拥有工厂后,您可以将其用于任何创建操作。
如果要从Food实例打印出Bread
,可以这样做:
//food is now an instanceof Bread
Food food = FoodFactory.get("Bread");
System.out.println(food.getType());
只是打印
Bread
此外:
为确保每个创作都只由FoodFactory
处理,您应该制作食物类的每个构造函数protected