Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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_Design Patterns - Fatal编程技术网

Java 如何在一个类中使用一个接口的多个实现?

Java 如何在一个类中使用一个接口的多个实现?,java,design-patterns,Java,Design Patterns,我想就以下问题寻求您的帮助 有一个接口有更多的实现: public interface MyInterface { void method(); } public class MyInterfaceA implements MyInterface public class MyInterfaceB implements MyInterface 还有一个类在其不同的方法中使用这些接口实现: public class MyClass { public void firstMetho

我想就以下问题寻求您的帮助

有一个接口有更多的实现:

public interface MyInterface {
    void method();
}
public class MyInterfaceA implements MyInterface
public class MyInterfaceB implements MyInterface
还有一个类在其不同的方法中使用这些接口实现:

public class MyClass {
    public void firstMethod() {
        new MyInterfaceA().method();
    }
    public void secondMethod() {
        new MyInterfaceB().method();
    }
}
我的问题是我不想在类的方法中创建新的特定实例,所以我想隐藏使用的实现

你知道解决这个问题的好办法吗?有什么我可以使用的设计模式吗?我如何隐藏具体的实现,或者我不能


提前感谢您的回答

例如,您可以在
MyClass
的构造函数中接收实现并进一步使用它。它帮助您隐藏特定的实现

public class MyClass {

    private MyInterface one;
    private MyInterface two;

    private MyClass(MyInterface one, MyInterface two) {
        this.one = one;
        this.two = two;
    }

    public void firstMethod() {
        one.method();
    }
    public void secondMethod() {
        two.method();
    }
}

您可以应用Factory模式:

class Factory {
    public MyInterface a() { return new MyInterfaceA(); }
    public MyInterface b() { return new MyInterfaceB(); }
}

public class MyClass {
    private Factory factory;
    public MyClass(Factory factory) { this.factory = factory; }
    public void firstMethod() {
        factory.a().method();
    }
    public void secondMethod() {
        factory.b().method();
    }
}

工厂
类中,您可以缓存必要时创建的对象。

不幸的是,接口的方法数量和实现数量可能会增加。这意味着构造函数可以变成很多参数的构造函数。我不想使用有很多参数的构造函数。顺便说一句,谢谢你的回答。@josamiti然后你可以使用
列表来代替。其中一个可能的解决方案是@mcepender建议的。另一方面,可以为构造复杂对象实现生成器模式。最后,您可能应该重新组织您的体系结构,并在多个类上分解这个类?接口的思想是调用类不需要知道实现。但是,在您发布的代码中,调用类似乎需要知道实现。那么,首先有一个接口有什么意义呢?我明白了。我想我用错界面了。我只是想把职能分开,以遵循单一责任原则。这就是我使用接口并创建其实现的原因。