有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

超类及其子类的java Factorypattern

我有三个班,一个班是另一个班的孩子: C类->;(子类)——>;B类->;(子类)——>;A类

每个类都是真实的,我想选择用方法实例化哪个类。 我可以使用工厂方法和so工厂模式来选择创建哪个类吗

多谢各位


共 (2) 个答案

  1. # 1 楼答案

    是的,您可以将factory方法模式用于协变返回类型。下面是一个示例代码

    public class MazeGame {
    
        public Maze createMaze() {
            // build the maze here.
    
            return aMaze;
        }
    
        public Room makeRoom(final int number) {
            return new Room(number);
        }
    
        public Wall makeWall() {
            return new Wall();
        }
    
        // ...
    }
    
    
    public class BombedMazeGame extends MazeGame {
    
        @Override
        public Room makeRoom(int number) {
            return new RoomWithABomb(number);
        }
    
        @Override
        public Wall makeWall() {
            return new BombedWall();
        }
    
    }
    
  2. # 2 楼答案

    是的,工厂方法是在您的上下文中使用的方法。我提供了如何实现它的快速示例

    import java.util.Scanner;
    
    public class FactoryMethodExample
    {
      public static void main(String[] args)
      {
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a letter A, B or C: ");
        String input = reader.nextLine();
        Factory factory = new ConcreteFactory();
        A myClass = factory.getClass(input.charAt(0));
        if(myClass != null)
        {
            myClass.print();
        }
        else
        {
            System.out.print("Wrong input");
        }
      }
    }
    
    class A
    {
      public void print()
      {
        System.out.print("I'm class A");
      }
    }
    
    class B extends A
    {
      @Override
      public void print()
      {
        System.out.print("I'm class B");
      }
    }
    
    class C extends B
    {
      @Override
      public void print()
      {
        System.out.print("I'm class C");
      }
    }
    
    abstract class Factory
    {
        public abstract A getClass(Character letter);
    }
    
    class ConcreteFactory extends Factory
    {
        @Override
        public A getClass(Character letter)
        {
            if(letter.equals('A'))
            {
                return new A();
            } 
            else if(letter.equals('B'))
            {
                return new B();
            }
            else if(letter.equals('C'))
            {
                return new C();
            }
            return null;
        }
    }