1

在 Head First Design Patterns 中,有人提到您应该编写接口而不是实现,但是代码示例的最后一部分让我感到困惑。如何在运行时分配对象的具体实现是一个更好的设计?

这是否意味着将对象的实例化放在使用超类型的类的方法中更好?(一种方法,其目的是专门将对象返回给超类的变量)

//Programming to an implementation would be:
Dog d = new Dog();
d.bark();

//Programming to an interface/supertype would be:
Animal animal = new Dog();
animal.makeSound();

//Even better is assigning the concrete implementation at runtime: (says the book)
a = getAnimal();
animal.makeSound();
4

2 回答 2

1

更好的方法是让其他人根据代码执行的环境/上下文来计算具体类。这称为控制反转/依赖注入,其中实际类要么在某些配置文件中配置,要么使用约定编码来识别正确的文件。

回到为什么,想象一个中等复杂性的项目,你必须与数据库交谈。如果您硬编码访问数据库的方式,您最终会要求客户坚持使用特定类型/版本的数据库。这就是 JDBC 的工作原理。同样对于更复杂的场景,想象一下从基于 Db 的系统文件转移。一旦您获得了该软件的设计灵活性,就很容易理解具体类的延迟初始化。

于 2013-10-02T02:55:39.177 回答
0

如果我用一个词来说明原因,那就是:中心化。

我的意思是,您在应用程序开始时在一个地方的某个地方分配这些具体类型,并将它们提供给需要它们作为接口的类,因此这些类不会与具体类型本身耦合,而是而是依赖于那些抽象或接口。

这类似于使用工厂模式,因此您不会将对象创建分散到整个程序中,而是在一个地方进行,这在将来很容易修改。

这也使您能够使用依赖注入控制反转,这反过来又带来了一堆好东西,比如更好的测试、可维护性、运行时配置等。

于 2013-10-02T12:41:39.673 回答