超类及其子类的工厂模式

时间:2018-03-31 14:51:49

标签: java design-patterns factory-pattern

我有3个班级,是另一个孩子的一个孩子: C类 - >(子类) - > B类 - >(子类) - > A级。

每个类都是真实的,我想选择通过方法实例化哪个类。 我可以使用Factory-method和factory-pattern来选择要创建的类吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

是的,您可以将工厂方法模式与covarient返回类型一起使用。这是一个示例代码。

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();
    }

}

答案 1 :(得分:0)

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

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;
    }
}