【问题标题】:Factory-pattern for superclass and its subclasses超类及其子类的工厂模式
【发布时间】:2018-03-31 14:51:49
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 你为什么不被自动化?^^

标签: java design-patterns factory-pattern


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对不起,我什至在 Wikipedia 上看到了这个例子。我问你另一个细节:为了填充新实例,我会使用模式(如果需要)。我可以为(databaseLoad vs userCreate)实例属性创建一个策略模式并将它们放入新实例吗? (坦克你)
    • 对不起,我没有得到你的问题。但是Strategy 是一种行为模式,与创建对象无关。仅当您需要将算法封装为对象时才使用Strategy。相反Factory Method 是一种创造模式。我从我最喜欢的“四种设计模式帮”一书中获得了上面的示例代码。
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多