【问题标题】:Java - Factory class that creates an abstract object?Java - 创建抽象对象的工厂类?
【发布时间】:2019-12-18 22:05:27
【问题描述】:

我有以下 2 个抽象类:

public abstract class AbstractCarChecker implements CarService {

}

以及以下扩展 AbstractCarChecker

public abstract class CarChecker<T extends Car> extends AbstractCarChecker {

}

我想要一个工厂类来实例化 CarChecker 对象,以便所有子类(例如FordCheckerFactory)可以扩展它来创建实例。

public class CarCheckerFactory {

    public CarCheckerFactory() { }

    public static CarChecker newFrom(String carName, String carReg) {

        CarChecker carChecker = new CarChecker(carName, carReg);

        return carChecker;
    }

}

但问题是我无法将 CarChecker 实例化为其摘要。

最好的方法是什么,使用if statement 来决定返回什么具体实现?例如将“ford”传递给newFrom 方法就知道要创建一个FordChecker 对象了吗?

【问题讨论】:

    标签: java constructor static factory abstract


    【解决方案1】:

    你可以这样做:

    public static CarChecker newFrom(String carName, String carReg, String className) {
        Class<?> theClass = Class.forName(className);
        Constructor<?> cons = theClass.getConstructor(String.class,String.class);
        CarChecker carChecker = cons.newInstance(new Object[] {carName, carReg });
        return carChecker;
    }
    

    其中className 属于具体类的名称。

    【讨论】:

      【解决方案2】:

      您不能创建抽象类的实例(因此,“抽象对象”不是一个东西)。

      工厂的整个概念是它们代表了创造事物的概念。因此,newFrom 方法不应该是静态的(因为那样它也可能是一个构造函数,而工厂作为一个概念是无用的;工厂的作用是让构造函数具有多态行为,就像实例方法一样) .因此:

      public interface CarCheckerFactory<T extends Car> {
          CarChecker<T> newFrom(String carName, String carReg);
      }
      
      public class FordCheckerFactory implements CarCheckerFactory<Ford> {
          return new FordChecker(carName, carReg);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多