Factory of Factories pattern
============================

This example demonstrates "Factory of Factories" pattern.

The idea of the pattern is in creating a ``Factory`` that creates another ``Factory`` and adds
additional arguments.

.. code-block:: python

   base_factory = providers.Factory(
       providers.Factory
       SomeClass,
       base_argument=1,
   )

   concrete_factory = providers.Factory(
       OtherClass,
       instance=base_factory(extra_argument=1),
   )


   if __name__ == '__main__':
       instance = concrete_factory()
       # Same as: # instance = SomeClass(base_argument=1, extra_argument=2)

Sample code
-----------

Listing of the pattern example:

.. literalinclude:: ../../examples/miniapps/factory-patterns/factory_of_factories.py
   :language: python

Arguments priority
------------------

Passing of the arguments works the same way like for any other :ref:`factory-provider`.

.. code-block:: python

   # 1. Keyword arguments of upper level factory are added to lower level factory
   factory_of_dict_factories = providers.Factory(
       providers.Factory,
       dict,
       arg1=1,
   )
   dict_factory = factory_of_dict_factories(arg2=2)
   print(dict_factory())  # prints: {'arg1': 1, 'arg2': 2}

   # 2. Keyword arguments of upper level factory have priority
   factory_of_dict_factories = providers.Factory(
       providers.Factory,
       dict,
       arg1=1,
   )
   dict_factory = factory_of_dict_factories(arg1=2)
   print(dict_factory())  # prints: {'arg1': 2}

   # 3. Keyword arguments provided from context have the most priority
   factory_of_dict_factories = providers.Factory(
       providers.Factory,
       dict,
       arg1=1,
   )
   dict_factory = factory_of_dict_factories(arg1=2)
   print(dict_factory(arg1=3))  # prints: {'arg1': 3}

Credits
-------

The "Factory of Factories" pattern was suggested by the ``Dependency Injector`` users.

.. disqus::