Задать вопрос
  • Как создать абстрактную фабрику, не ссылаясь на реализацию?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В приложении, которое использует Dependency Injection можно выделить 2 "области":
    - Composition Root
    - Остальное приложение

    Composition Root - это место в котором собираются все зависимости воедино. О всех реализациях зависимостей должен знать только он.
    Остальное приложение - это (тафтология) все остальное приложение. Они используют только интерфейсы и другие абстрации.

    Обычно Composition Root - это входная точка приложения. В нем создается эта самая ServiceFactoryImpl (стандартные реализации, из конфигурации могут быть прочитаны флаги, создан в зависимости от платформы и т.д.), а затем как интерфейс IServiceFactory, передается в остальные места.

    Т.е. в коде это будет как-то так
    #include <IServiceFactory.h>
    
    class Sample {
    private:
        IServiceFactory _factory;
    public:
        Sample(IServiceFactory factory): _factory(factory) { }
        DoSomething() { 
            auto service = _factory.CreateService();
            service.MakeStuff();
        }
    }
    
    int main() {
        auto factory = ServiceFactoryImpl(); // Читаем конфигурацию, параметры ОС и др.
        auto sample = Sample(factory);
        sample.DoSomething();
    }
    Ответ написан
    1 комментарий
  • Как создать абстрактную фабрику, не ссылаясь на реализацию?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Да, где-то в "верхних слоях кода" тебе всё равно надо будет явно сослаться на ServiceFactoryImpl, от этого не уйти. Но это совсем маленький "грязный" участок. А в остальном коде ты спокойно работаешь с этим экземпляром IServiceFactory и создаваемыми с помощью него имплементациями IService
    Ответ написан
    Комментировать