Фабрика затем сохраняется в компоненте как провайдер.
Это почти верно, но не совсем. Сгенерированный код компонента выглядит примерно так:
this.provideDatabaseProvider = DoubleCheck.provider(DbModule_ProvideDatabaseFactory.create());
Метод DoubleCheck.provider
возвращает экземпляр DoubleCheck
, который делегируется исходному поставщику. Это, а не исходная фабрика, сохраняется в компоненте.
Реализация get
в DoubleCheck
затем вызывает делегат Provider
ровно один раз и сохраняет результат. Каждый последующий вызов get
возвращает экземпляр, сохраненный ранее.