Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以下设计模式如何成为工厂方法。我认为这更像是一个抽象的工厂,而不是工厂方法_Java_C#_Oop_Design Patterns_Factory Pattern - Fatal编程技术网

Java 以下设计模式如何成为工厂方法。我认为这更像是一个抽象的工厂,而不是工厂方法

Java 以下设计模式如何成为工厂方法。我认为这更像是一个抽象的工厂,而不是工厂方法,java,c#,oop,design-patterns,factory-pattern,Java,C#,Oop,Design Patterns,Factory Pattern,以下问题中使用的设计模式如何成为工厂方法?。我怀疑它既不是工厂方法,也不是抽象工厂。这是两者的混合。 interface Vehicle { } class Car implements Vehicle{ } // Oil Vehicles class Bus implements Vehicle{ } class ElectricCar implements Vehicle{ } // ElectricVehicles class ElectricBus implements Ve

以下问题中使用的设计模式如何成为工厂方法?。我怀疑它既不是工厂方法,也不是抽象工厂。这是两者的混合。

interface Vehicle { }
class Car implements Vehicle{ }       // Oil Vehicles
class Bus implements Vehicle{ }
class ElectricCar implements Vehicle{ } // ElectricVehicles
class ElectricBus implements Vehicle{ }

interface VehicleFactory{
  Vehicle make(int seats);
}

class OilVehicleFactory implements VehicleFactory{ // Oil vehicle Factory 
  @Override
  Vehicle make(int  seats){
     if(seats > 5){
        return new Bus();
     }
     else{
          return new Car();
    }
}

class ElectricVehicleFactory implements VehicleFactory{ // Electric Vehicle Factory
  @Override
  Vehicle make(int  seats){
     if(seats > 5){
        return new ElectricBus();
     }
     else{
          return new ElectricCar();
    }
}

class Client{                   // Cient Code
    boolean isElectric;

    void doSomething(){
     VehicleFactory  factory;
     if(isElectric){ 
       factory = new ElectricVehicleFactory();   
     }
     else{
       factory = new oilVehicleFactory();
    }

    Vehicle vehicle = factory.make(5);
}
我认为这不是一种工厂方法,因为:

  • 它使用接口VehicleFactory(用于抽象工厂)

  • 它正在创建石油汽车和电动汽车等产品系列

  • 它不使用继承

  • 出于同样的原因,我认为这是一种抽象的工厂方法。但它不为工厂使用成分

    它到底是什么图案?


    谢谢

    您的代码示例实现了抽象工厂模式。它满足模式的定义

    要调用策略设计模式,它必须满足某些约束。一个限制是,它必须有一个明确的定义

    通过对照定义验证设计,您可以简单地验证您的实现是否符合模式:

    抽象工厂 “提供一个接口,用于创建相关或从属对象(2)的族(1),而无需指定其具体类(3)。”

    (1) 您已经定义了一个抽象工厂:

    interface VehicleFactory {
    
      // Returns a
      Vehicle make(int seats);
    }
    
    (2) 您已经定义了一个抽象产品系列:

    interface Vehicle { }
    
    (3) 由于抽象工厂返回抽象类型,因此客户端不必知道具体的实现:

    Vehicle make(int seats);
    

    工厂法 “定义一个接口来创建一个对象(1),但让子类决定实例化哪个类(2)。工厂方法让类将它使用的实例化延迟到子类。”(四人组)

    您的代码显然不满足定义的(2)

    根据定义,适当的实施方式是:

    (1)

    (2)

    用法

    Location destination = new Location("Workplace");
    Driver driver = new BusDriver();
    driver.driveToLocation(destination);
    

    您需要做的第一件事是找出您所使用的语言,然后标记accordingly@TheGeneral很近吗?另外,模式语言是特定的吗?更适合于设计模式和讨论thereof@TheGeneral当参考其他站点时,指出设计模式是常见问题的通用解决方案通常是有帮助的。代码预期解决的设计问题/意图/要求是什么?
    abstract class Driver implements VehicleFactory {
    
      // Let subclasses decide which class to instantiate
      abstract protected Vehicle make();
    
      public void driveToLocation(Location destination) {
    
        // Let subclasses decide which class to instantiate
        Vehicle car = makeVehicle();
    
        car.driveTo(destination);
      }
    }
    
    class TaxiDriver extends Driver {
      @Override    
      protected Vehicle makeVehicle() {
        return new Taxi();
      }
    }
    
    class BusDriver extends Driver {
      @Override    
      protected Vehicle makeVehicle() {
        return new Bus();
      }
    }
    
    Location destination = new Location("Workplace");
    Driver driver = new BusDriver();
    driver.driveToLocation(destination);