控制反转定义
Inversion of Control definition
在 Spring 参考文献中我们读到:
IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.
我理解正确吗?依赖项是 -
1) 他们使用的其他对象,仅通过构造函数参数,工厂方法的参数
2)对象实例在构造或从工厂方法返回后设置的属性
请对这两项和第二个问题给出简单的例子——什么是工厂方法?请详细说明。
根据该定义,依赖项是:
other objects they work with
例如,假设您有这个 class:
class Widget {
public void DoSomething() {
WidgetCalculator calculator = new WidgetCalculator();
int someValue = calculator.calculate();
// and so on...
}
}
在此设置中,Widget
依赖于 WidgetCalculator
。它是 Widget
"works with" 的对象,或者更确切地说,是 Widget
执行其自身工作所需的对象。上面的代码完成了这项工作,但它导致了紧耦合。您不能轻易换出 WidgetCalculator
的不同实现,例如,一个 class 中的重大更改可能会破坏另一个 class,等等
这就是 dependency inversion 有用的地方。它可以需要一个创建一个WidgetCalculator
的实例。这可能很简单:
class Widget {
public void DoSomething(WidgetCalculator calculator) {
int someValue = calculator.calculate();
// and so on...
}
}
现在为了执行该操作,调用该操作的任何消费代码都需要提供 Widget
及其依赖项。如果 Widget
上有很多代码具有该依赖性,则可以将其提升为构造函数参数,以便使用代码甚至无法 create a Widget
不提供依赖项:
class Widget {
private final WidgetCalculator calculator;
public Widget(WidgetCalculator calculator) {
this.calculator = calculator;
}
public void DoSomething() {
int someValue = this.calculator.calculate();
// and so on...
}
}
可以通过多种方式提供依赖关系,但核心原则是对象需要向其提供依赖关系而不是寻找依赖关系本身。
在 Spring 参考文献中我们读到:
IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.
我理解正确吗?依赖项是 -
1) 他们使用的其他对象,仅通过构造函数参数,工厂方法的参数
2)对象实例在构造或从工厂方法返回后设置的属性
请对这两项和第二个问题给出简单的例子——什么是工厂方法?请详细说明。
根据该定义,依赖项是:
other objects they work with
例如,假设您有这个 class:
class Widget {
public void DoSomething() {
WidgetCalculator calculator = new WidgetCalculator();
int someValue = calculator.calculate();
// and so on...
}
}
在此设置中,Widget
依赖于 WidgetCalculator
。它是 Widget
"works with" 的对象,或者更确切地说,是 Widget
执行其自身工作所需的对象。上面的代码完成了这项工作,但它导致了紧耦合。您不能轻易换出 WidgetCalculator
的不同实现,例如,一个 class 中的重大更改可能会破坏另一个 class,等等
这就是 dependency inversion 有用的地方。它可以需要一个创建一个WidgetCalculator
的实例。这可能很简单:
class Widget {
public void DoSomething(WidgetCalculator calculator) {
int someValue = calculator.calculate();
// and so on...
}
}
现在为了执行该操作,调用该操作的任何消费代码都需要提供 Widget
及其依赖项。如果 Widget
上有很多代码具有该依赖性,则可以将其提升为构造函数参数,以便使用代码甚至无法 create a Widget
不提供依赖项:
class Widget {
private final WidgetCalculator calculator;
public Widget(WidgetCalculator calculator) {
this.calculator = calculator;
}
public void DoSomething() {
int someValue = this.calculator.calculate();
// and so on...
}
}
可以通过多种方式提供依赖关系,但核心原则是对象需要向其提供依赖关系而不是寻找依赖关系本身。