用依赖注入设计工厂类
Designing factory class with dependency injection
我有一个必须接收工厂BFactory的类A。BFactory创建b的实现。每个实现类需要注入不同的服务。
class B
{
};
class C : public B
{
public:
C(shared_ptr<ServiceL> serviceL);
};
class D : public B
{
public:
C(shared_ptr<ServiceM> serviceM);
};
我应该把它的所有实现所需的所有服务注入到BFactory中,还是应该使用不同的设计?如果我把所有的服务都注入到BFactory,那么BFactory将会是这样的:
class BFactory
{
public:
BFactory(shared_ptr<ServiceL> serviceL, shared_ptr<ServiceM> serviceM);
shared_ptr<B> createInstance(Btype type);
private:
shared_ptr<ServiceL> _serviceL;
shared_ptr<ServiceM> _serviceM
};
BFactory::BFactory(shared_ptr<ServiceL> serviceL, shared_ptr<ServiceM> serviceM) : _serviceL(serviceL), _serviceM(serviceM)
{
}
void BFactory::createInstance(Btype type)
{
if (type == ...)
{
return shared_ptr<B>(new C(_serviceL));
}
else if (type == ...)
{
return shared_ptr<B>(new D(_serviceM));
}
}
您所演示的将产品的依赖关系传递给工厂的方法就是我所使用的方法。事实上,这些通常是我注入工厂的唯一依赖类型。
工厂对象的唯一目的是按需生产产品。为了实现这一目的,工厂有责任确保产品在发布之前具有所需的依赖项。
工厂与其产品类型紧密耦合。它们必须,因为它们调用了产品的构造函数。
这种紧密耦合的后果之一是工厂也与其产品的依赖项相耦合。因此,产品的每个依赖项也是工厂的一个依赖项,应该像其他依赖项一样注入到工厂中。
事实上,这就是为什么我们在系统的其他地方设计松耦合。有了紧密耦合,对象就知道它的依赖项的依赖项,以及它们的依赖项。通过使用工厂,我们能够控制这种复杂性,并防止它泄漏到系统的其余部分。
我将创建一个ServiceFactory
并将其提供给BFactory
。然后根据类型,BFactory
可以在BFactory::createInstance
方法中请求ServiceFactory
创建相应的服务,该服务将用于创建B
实例。
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 当基类是依赖类型时,这是一个缺陷吗
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 解决使用工厂时的循环依赖关系
- 打破工厂模式中的循环依赖关系
- 工厂类的依赖注入
- 用依赖注入设计工厂类