java - 工厂设计模式和Diamond OOP问题

标签 java oop design-patterns

在我的一个项目中,我必须实现工厂设计模式来解决特定问题。

我有一个父接口(interface)和两个子接口(interface)。在下一阶段,我必须创建一个工厂,它将根据给定的输入返回特定类的实例。

请参阅下面的示例代码,它解释了我的问题以及示例图。

示例图

enter image description here

示例代码

enum AnimalType{ DOG, CAT }

Class Factory{
    public Animal getInstance(AnimalType animalType){
        Animal animal = null;
        switch(animalType){
            case DOG: animal = new Dog();
                break;

            case CAT: animal = new Cat();
                break;
            default:
                break;
        }
        return animal;
    }
}

/*Actual Problem */
Animal animal = Factory.getInstance(AnimalType.DOG);

  /* When I use any IDE like IntellijIdea or Eclipse it only provides eat() method after animal and dot (ie. animal. ) */
animal.<SHOULD PROVIDE eat() and woof() from Dog> but it is only providing eat()

有什么建议可以解决这个问题吗?或者,我应该考虑解决这个问题的任何其他设计模式吗?

最佳答案

您的问题与工厂模式没有直接关系。您正在声明一个 Animal,然后想将其视为 Dog。无论您如何创建它,您都需要将其设为Dog来调用doggy方法。

您有多种选择来解决此问题。这里有一些替代方案。

  1. 有单独的方法来创建 Animal 的不同扩展。因此,工厂中将使用 Dog getDog()Cat getCat() 方法,而不是 Animal getInstance(AnimalType type) 。鉴于工厂无论如何都需要了解所有这些类,这对我来说似乎是最好的选择。

  2. 继续从工厂返回 Animal 实例,但随后使用“访客”模式以不同方式对待狗和猫。

  3. 使用 instanceof 和转换将动物视为狗或猫。在大多数情况下不建议这样做,但在某些情况下是合适的。

关于java - 工厂设计模式和Diamond OOP问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602865/

相关文章:

java - 没有这样的表问题

PHP5面向对象: Accessing changed parent properties

java - 从不同资源创建 View 对象的最佳方法(模式?)

c++ - C++中的原型(prototype)设计模式和复制构造函数有什么区别

spring - 为什么我们需要服务层?

java - 如何隐藏所有其他 fragment

java - 我得到的分母为负数

java - 在文档监听器中允许空字符串的最简单方法

PHP链式方法,如何知道哪一个是最后一个

java - 如何将代码转换为泛型方法 - Object.class