用依赖注入设计工厂类

Designing factory class with dependency injection

本文关键字:工厂 依赖 注入      更新时间:2023-10-16

我有一个必须接收工厂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实例。