c++ - 单例模式与依赖注入(inject)的关系

标签 c++ design-patterns

来自这里:http://www.codingwithoutcomments.com/

If you do use Singletons, try to use dependency injection instead of calling getInstance() from the constructor, use this:

public MyConstructor(Singleton singleton) 
{
     this.singleton = singleton; 
} 

rather than this:

public MyConstructor() 
{
     this.singleton = Singleton.getInstance(); 
}

At the very least, using dependency injection allows you to do some unit testing of the class by adhering to good encapsulation principles.

这个“依赖注入(inject)”怎么样?依赖注入(inject)是什么意思?
这不是违背了单例模式的目的吗?

这是否应该使用一段时间,然后再删除?

最佳答案

How is this "dependency injection"?

“依赖注入(inject)”意味着您显式地提供一个对象,并引用它所依赖的所有其他对象;这就是第一个示例在将引用传递给构造函数时所做的事情。

另一种方法是隐式提供它所依赖的对象,使它们可以全局访问。这就是第二个示例所做的。

依赖注入(inject)的主要优点是依赖可以在抽象接口(interface)上;没有必要将您的类绑定(bind)到特定的具体类或该类的特定实例。这使测试更加方便——您的类可以单独测试,与它所依赖的任何接口(interface)的“ stub ”实现交互。它还可以更轻松地跟踪依赖项,因为它们都在代码中明确说明。

使用全局变量的主要优点是它们可以让你编写的代码稍微少一些,并且在它们成为问题之前你不需要担心管理依赖项;当他们这样做时,您可以简单地放弃该项目并开始一个新项目。

Doesn't this defeat the purpose of the Singleton pattern?

这取决于您认为反模式的目的是什么。它确实消除了全局可访问实例的便利性;但是,假设 Singleton 类确实遵循反模式,您仍然可以确信您收到的对象是一个真实的实例。

Is this supposed to be used for some time and then removed later on?

一旦您需要执行反模式阻止的事情(单元测试、多个实例、子类型、抽象接口(interface)等),单例应该被替换为普通类,通过引用传递给它的依赖项。一旦依赖注入(inject)存在,就几乎不需要删除它;只有当你发现单例不符合你的要求时,你才需要重新装回去。

关于c++ - 单例模式与依赖注入(inject)的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191942/

相关文章:

c++ - 二进制解析器还是序列化?

javascript - overflow-x 和鼠标中键移动

design-patterns - 每个实体一项服务?

c++ - 排序数组/字符串 vector

c++ - 将一个字符串添加到另一个字符串之前

c++ - STL::list 对象的最大数量

c++11 - 整理 C++ 运算符重载

c++ - 工厂的工厂?

java - 是否存在隐藏供应商特定逻辑的数据存储查询的良好通用模式?

c++ - 显式构造函数和 static_cast