当我在阅读工厂时,首先在设计模式书上抽象了工厂设计模式。它提到了这句话。
你能否举一个基本的例子和解释来澄清它。
依赖倒置原则;五个面向对象设计原则之一。查看这个问题的答案;“什么是依赖倒置原则,为什么它很重要?” - 那里有一些非常好的信息。
在传统的应用程序架构中,较低级别的组件被设计为由较高级别的组件使用,从而能够构建越来越复杂的系统。在这种组合中,高级组件直接依赖于低级组件来完成某些任务。这种对低层组件的依赖限制了高层组件的重用机会。
用“简单”的术语来说,这意味着当您依赖对象的具体实例时 - 您正在构建对代码的依赖关系(尽管没有这种意图),这会限制重用它的能力。
请记住,具体类型是可以实例化的类类型,而抽象类型是不能实例化的类型;即一个界面。(见分类分类)
如果您对特定的具体类进行编码,那么您将始终需要该类。但是,如果您对接口(抽象)进行编码,则可以调整您的代码以与任意数量的类一起使用;只要他们实现了那个通用接口。
因此,在 Java 中,这意味着您应该尽可能对接口进行编码 - 并避免使您的代码依赖于特定项目。这通常就像传递Interface
类型作为参数和返回类型一样简单;与具体类相反。
更少的依赖 = 更多的代码重用能力。更多的依赖=更多的要求能够重用代码。
当您学习设计模式时,这将是一个反复出现的主题!
因为工厂是虚拟构造函数。它们使您能够在运行时返回不同的类型。工厂依赖于多态性。
如果你返回具体类型,你就不能做任何这样的事情。
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();
}
}
很明显,如果您Bar
从 create 方法返回 a ,则 aBaz
是不可能的,反之亦然。界面是关键。
依赖抽象可能会帮助您在类之间获得松耦合。这就是为什么它被建议。考虑一个示例Animal
类。如果您可以通过其定义保留许多抽象,那么当您定义更具体的类(例如Dog
和)时,您将具有更大的弹性Bird
。如果你把一个具体的特性Dog
放在里面Animal
,那么你在尝试编写Bird
扩展时就会发生冲突Animal
。所以总是将事物抽象到类层次结构的上层。