当我在阅读工厂时,在头部设计模式上抽象工厂设计模式 书。它提到了这句话。
你能给出一个基本的例子和解释来澄清它。
答案 0 :(得分:8)
依赖性倒置原则;五个中的一个Object Oriented Design Principles。看看这个问题的答案; "What is the Dependency Inversion Principle and why is it important?" - 那里有一些非常好的信息。
在传统的应用程序架构中,较低级别的组件被设计为由更高级别的组件使用,这使得能够构建越来越复杂的系统。在此组合中,更高级别的组件直接依赖于较低级别的组件来完成某些任务。这种对较低级别组件的依赖限制了较高级别组件的重用机会。
在'简单'术语中,这意味着当您依赖于对象的具体实例时 - 您正在构建对代码的依赖(尽管没有这种意图),这就限制了能够重复使用它。
请记住,具体类型是一种可以实例化的类,抽象类型是一种不能实现的类型。即一个界面。 (见Taxonomy of Classes)
如果您编写特定的具体类,那么您将始终具有该类的要求。但是,如果您编写一个接口(抽象),那么就可以调整您的代码以使用任意数量的类;只要他们实现那个通用接口。
因此在Java中,这意味着您应该尽可能地编写接口代码 - 并避免使代码依赖于特定项。这通常像将Interface
类型作为参数和返回类型一样简单;而不是具体的课程。
较少的依赖关系=更多重用代码的能力。 更多依赖项=能够重用代码的更多要求。
当您学习设计模式时,这将是一个重新出现的主题!
维基百科上的答案 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方法返回Bar
,Baz
是不可能的,反之亦然。界面是关键。
答案 2 :(得分:1)
取决于抽象可能会帮助您在类之间获得松散耦合。这就是建议的原因。想想一个示例Animal
类。如果您可以使用其定义保留许多抽象,则在定义更具体的类(例如Dog
和Bird
)时,您将具有更大的弹性。如果您在Dog
中添加Animal
的具体功能,那么当您尝试编写Bird
扩展Animal
时,您会遇到冲突。所以总是把抽象的东西放到类层次结构的上层。