Java 多工厂方法与单一方法

Java 多工厂方法与单一方法,java,class,factory,factory-method,construction,Java,Class,Factory,Factory Method,Construction,是否最好对所有实例使用单个工厂方法和通用构造函数,然后填充实例?还是应该使用多种工厂方法和构造函数?每种方法的优点是什么 例如(选项1): 在这里,飞机和汽车将有一个简单的通用构造函数,但需要多个setter和getter。调用方必须填充实例 或(选项2): 在这里,我们不需要getter和setter,但每个实例需要不同的构造函数。这里有另一种方法: VehicleFactory<E extends Vehicle> { E getVehicle(int serialNo,

是否最好对所有实例使用单个工厂方法和通用构造函数,然后填充实例?还是应该使用多种工厂方法和构造函数?每种方法的优点是什么

例如(选项1):

在这里,飞机和汽车将有一个简单的通用构造函数,但需要多个setter和getter。调用方必须填充实例

或(选项2):


在这里,我们不需要getter和setter,但每个实例需要不同的构造函数。

这里有另一种方法:

VehicleFactory<E extends Vehicle> {
    E getVehicle(int serialNo, VehicleProperty<E> ... args);
}
CarFactory extends VehicleFactory<Car>{
    @Override
    Car getVehicle(int serialNo, VehicleProperty<Car> ... args);
}

VehicleProperty<E extends Vehicle>{ /* getters and setters */}
CarProperty extends VehicleProperty<Car>{}
车辆工厂{
E获取车辆(int序列号、车辆属性…参数);
}
汽车制造厂{
@凌驾
车辆获取车辆(int序列号、车辆属性…参数);
}
车辆属性{/*getter和setter*/}
CarProperty扩展了车辆属性{}

您可以这样做,但请记住,从超类继承生成器方法意味着您必须首先设置所有特定于汽车的字段(或进行大量转换)

抽象类车辆{
目标车辆规格字段1、车辆规格字段2;
}
二等车{
对象字段;
车辆(最终目标车辆规格字段1、最终目标车辆规格字段2、最终目标车辆规格字段){
this.VehiclesSpecificField1=车辆规格Field1;
此.Vehicles SpecificField2=车辆规格Field2;
this.carSpecificField=carSpecificField;
}
}
抽象类车辆生成器{
目标车辆规格字段1、车辆规格字段2;
公共车辆制造商车辆规格字段1(最终目标车辆规格字段1){
this.VehiclesSpecificField1=车辆规格Field1;
归还这个;
}
公共车辆制造商车辆规格字段2(最终目标车辆规格字段2){
此.Vehicles SpecificField2=车辆规格Field2;
归还这个;
}
抽象E create();
}
类CarBuilder扩展了VehicleBuilder{
对象字段;
公共CarBuilder carSpecificField(最终对象carSpecificField){
this.carSpecificField=carSpecificField;
归还这个;
}
@凌驾
汽车制造(){
归还新车(车辆规格字段1、车辆规格字段2、车辆规格字段);
}
}
公共静态void main(字符串[]args){
Car Car=new CarBuilder().carSpecificField(“Car”).vehiclesspecificfield1(“foo”).vehiclesspecificfield2(“bar”).create();
}

考虑使用构建器模式。构建器模式似乎是一条可行之路。
VehicleFactory {
  Car createCar(int serialNo, CarSpecificField1 field1, CarSpecificField2 field2, ...)
  Plane createPlane(int serialNo, PlaneSpecificField1 field1, PlaneSpecificField2, ...)
}

Car car = VehicleFactory.createCar(serialNo1, carSpecificField1, ...);
Plane plane = VehicleFactory.createPlane(serialNo2, planeSpecificField1, ...);
VehicleFactory<E extends Vehicle> {
    E getVehicle(int serialNo, VehicleProperty<E> ... args);
}
CarFactory extends VehicleFactory<Car>{
    @Override
    Car getVehicle(int serialNo, VehicleProperty<Car> ... args);
}

VehicleProperty<E extends Vehicle>{ /* getters and setters */}
CarProperty extends VehicleProperty<Car>{}
abstract class Vehicle {
    Object vehicleSpecificField1, vehicleSpecificField2;
}

class Car extends Vehicle {
    Object carSpecificField;

    Car(final Object vehicleSpecificField1, final Object vehicleSpecificField2, final Object carSpecificField) {
        this.vehicleSpecificField1 = vehicleSpecificField1;
        this.vehicleSpecificField2 = vehicleSpecificField2;
        this.carSpecificField = carSpecificField;
    }
}

abstract class VehicleBuilder<E extends Vehicle> {
    Object vehicleSpecificField1, vehicleSpecificField2;

    public VehicleBuilder<E> vehicleSpecificField1(final Object vehicleSpecificField1) {
        this.vehicleSpecificField1 = vehicleSpecificField1;
        return this;
    }

    public VehicleBuilder<E> vehicleSpecificField2(final Object vehicleSpecificField2) {
        this.vehicleSpecificField2 = vehicleSpecificField2;
        return this;
    }

    abstract E create();

}

class CarBuilder extends VehicleBuilder<Car> {
    Object carSpecificField;

    public CarBuilder carSpecificField(final Object carSpecificField) {
        this.carSpecificField = carSpecificField;
        return this;
    }

    @Override
    Car create() {
        return new Car(vehicleSpecificField1, vehicleSpecificField2, carSpecificField);
    }
}

public static void main(String[] args) {
    Car car = new CarBuilder().carSpecificField("car").vehicleSpecificField1("foo").vehicleSpecificField2("bar").create();
}