Java工厂模式,创建特定的类

时间:2016-05-07 19:32:49

标签: java factory

我有一个问题,在一次采访中,我有两种食物,比如面包和蛋糕,给出了以下内容:

 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返回。

我只是想知道我是否遗漏了任何东西,因为FoodFactoryFood是给出的类,所以我认为那些是我需要改变的唯一两个类。有没有办法实现给定的两个类,并在仅使用这两个类时打印"bread"

5 个答案:

答案 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应该最多变成一个接口或一个抽象类。然后,您可以使用BreadCake类来实现/扩展Food。您的FoodFactory有一个静态方法get,它接受​​食物作为字符串。根据值,您实例化并返回一个具体类,它将为您提供打印类名时所需的内容。

答案 3 :(得分:0)

我认为面试官提出的真正问题是你是否了解模式和多态性。正如其中一条评论所述getClass().getName()将不会返回'Bread',除非确实存在Bread类。您可以做的是建议采访者Food是基类,在这种情况下应该由CakeBread类扩展,或者甚至建议将其更改为摘要类或接口。然后你可以提出一个简单的工厂类,它将在基类接口后面创建所需的“隐藏”实现。

答案 4 :(得分:0)

您的问题基本上是Java Factory Design Pattern的一个示例。 假设你有一个项目,分别是一个具有多个接口和不同类的类层次结构,那么创建任何类的最简单方法是什么?这是工厂到位处理有关类实例创建的所有操作的地方。

现在,您可以方便地将Class Food更改为界面,例如:

public interface Food {
    String getType();
}

现在您需要实现Cake

Breadinterface 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