From 144665ef3f65752fd38a576112c6d5c5dd44d80a Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Fri, 7 Apr 2017 00:47:30 +0300 Subject: [PATCH] Add docs about AbstractFactory provider --- docs/images/providers/abstract_factory.png | Bin 0 -> 38000 bytes docs/providers/factory.rst | 38 +++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 docs/images/providers/abstract_factory.png diff --git a/docs/images/providers/abstract_factory.png b/docs/images/providers/abstract_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..ede202af7762d06f1f8e895bc1e114b198868865 GIT binary patch literal 38000 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 SWLGfHD=(vbx8TkLpZ^EuqZ!u# literal 0 HcmV?d00001 diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index e626f218..3d40b366 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -106,5 +106,43 @@ provided type: :language: python :linenos: +Abstract factory providers +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:py:class:`AbstractFactory` is a :py:class:`Factory` provider that must be +explicitly overridden before calling. + +.. note:: + + Overriding of :py:class:`AbstractFactory` is possible only by another + :py:class:`Factory` provider. + +:py:class:`AbstractFactory` provider is useful when it is needed to specify +explicitly that it only provides abstraction, but not an implementation. +Client code must override such factories with factories that provide particular +implementations. Otherwise, :py:class:`AbstractFactory` will raise an error +on attempt of calling it. At the same time, :py:class:`AbstractFactory` is +regular provider that could be injected into other providers (or used for +any other kind of bindings) without being overridden. After +:py:class:`AbstractFactory` provider has been overridden, its behaviour is +identical to regular :py:class:`Factory` provider. + +Example: + +.. image:: /images/providers/abstract_factory.png + :width: 100% + :align: center + +Listing of ``cache.py``: + +.. literalinclude:: ../../examples/providers/abstract_factory/cache.py + :language: python + :linenos: + +Listing of ``example.py``: + +.. literalinclude:: ../../examples/providers/abstract_factory/example.py + :language: python + :linenos: .. disqus::