取决于抽象。不要依赖具体的课程

时间:2012-11-25 15:27:24

标签: java oop design-patterns

当我在阅读工厂时,在头部设计模式上抽象工厂设计模式 书。它提到了这句话。

你能给出一个基本的例子和解释来澄清它。

3 个答案:

答案 0 :(得分:8)

依赖性倒置原则;五个中的一个Object Oriented Design Principles。看看这个问题的答案; "What is the Dependency Inversion Principle and why is it important?" - 那里有一些非常好的信息。

  

在传统的应用程序架构中,较低级别的组件被设计为由更高级别的组件使用,这使得能够构建越来越复杂的系统。在此组合中,更高级别的组件直接依赖于较低级别的组件来完成某些任务。这种对较低级别组件的依赖限制了较高级别组件的重用机会。

在'简单'术语中,这意味着当您依赖于对象的具体实例时 - 您正在构建对代码的依赖(尽管没有这种意图),这就限制了能够重复使用它。

请记住,具体类型是一种可以实例化的类,抽象类型是一种不能实现的类型。即一个界面。 (见Taxonomy of Classes

如果您编写特定的具体类,那么您将始终具有该类的要求。但是,如果您编写一个接口(抽象),那么就可以调整您的代码以使用任意数量的类;只要他们实现那个通用接口。

因此在Java中,这意味着您应该尽可能地编写接口代码 - 并避免使代码依赖于特定项。这通常像将Interface类型作为参数和返回类型一样简单;而不是具体的课程。

较少的依赖关系=更多重用代码的能力。 更多依赖项=能够重用代码的更多要求。

当您学习设计模式时,这将是一个重新出现的主题!

维基百科上的

Dependency Inversion Principle

答案 1 :(得分:2)

因为工厂是虚拟构造函数。它们使您能够在运行时返回不同类型。工厂依赖于多态性。

如果你返回具体的类型,你不能做任何这样的事情。

public interface IFoo {
    void execute();
}

public class Bar implements IFoo {
    public void execute() { System.out.println("Bar does one thing"); }
}

public class Baz implements IFoo {
    public void execute() { System.out.println("Baz does another"); }
}

public class FooFactory { 
    private static final FooFactory instance = new FooFactory(); 

    private FooFactory() {}

    public static final FooFactory getInstance() { return instance; }

    public IFoo create(Class clazz) { 
        return clazz.newInstance();
    }
}

很明显,如果从create方法返回BarBaz是不可能的,反之亦然。界面是关键。

答案 2 :(得分:1)

取决于抽象可能会帮助您在类之间获得松散耦合。这就是建议的原因。想想一个示例Animal类。如果您可以使用其定义保留许多抽象,则在定义更具体的类(例如DogBird)时,您将具有更大的弹性。如果您在Dog中添加Animal的具体功能,那么当您尝试编写Bird扩展Animal时,您会遇到冲突。所以总是把抽象的东西放到类层次结构的上层。