doc: create and document packages

This commit is contained in:
Ruidy 2020-09-29 22:05:56 +02:00
parent d72ec61f5d
commit d99ed01f65
47 changed files with 109 additions and 52 deletions

View file

@ -23,8 +23,8 @@ and divided into three groups.
### [Creational Patterns](creational/README.md) ### [Creational Patterns](creational/README.md)
- [Factory Method](creational/factory-method/README.md) - [Factory Method](creational/factory_method/README.md)
- [Abstract Factory](creational/abstract-factory/README.md) - [Abstract Factory](creational/abstract_factory/README.md)
- [Builder](creational/builder/README.md) - [Builder](creational/builder/README.md)
- [Prototype](creational/prototype/README.md) - [Prototype](creational/prototype/README.md)
- [Singleton](creational/singleton/README.md) - [Singleton](creational/singleton/README.md)

View file

View file

@ -2,8 +2,8 @@
Creational patterns provide various object creation mechanisms, which increase flexibility and reuse of existing code. Creational patterns provide various object creation mechanisms, which increase flexibility and reuse of existing code.
- [Factory Method](factory-method/README.md) - [Factory Method](factory_method/README.md)
- [Abstract Factory](abstract-factory/README.md) - [Abstract Factory](abstract_factory/README.md)
- [Builder](builder/README.md) - [Builder](builder/README.md)
- [Prototype](prototype/README.md) - [Prototype](prototype/README.md)
- [Singleton](singleton/README.md) - [Singleton](singleton/README.md)

4
creational/__init__.py Normal file
View file

@ -0,0 +1,4 @@
"""
Creational patterns provide various object creation mechanisms, which increase
flexibility and reuse of existing code.
"""

View file

@ -1,7 +1,7 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from AbstractProductA import AbstractProductA from creational.abstract_factory.AbstractProductA import AbstractProductA
from AbstractProductB import AbstractProductB from creational.abstract_factory.AbstractProductB import AbstractProductB
class AbstractFactory(ABC): class AbstractFactory(ABC):

View file

@ -1,6 +1,6 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from AbstractProductA import AbstractProductA from creational.abstract_factory.AbstractProductA import AbstractProductA
class AbstractProductB(ABC): class AbstractProductB(ABC):

View file

@ -0,0 +1,4 @@
"""
Lets you produce families of related objects without specifying their concrete
classes.
"""

View file

@ -1,10 +1,6 @@
from AbstractFactory import AbstractFactory from creational.abstract_factory.AbstractFactory import AbstractFactory
from products import ( from creational.abstract_factory.products import ConcreteProductA1, \
ConcreteProductA1, ConcreteProductB1, ConcreteProductA2, ConcreteProductB2
ConcreteProductA2,
ConcreteProductB1,
ConcreteProductB2,
)
class ConcreteFactory1(AbstractFactory): class ConcreteFactory1(AbstractFactory):

View file

@ -1,7 +1,8 @@
"""The client code can work with any concrete factory class.""" """The client code can work with any concrete factory class."""
from AbstractFactory import AbstractFactory from creational.abstract_factory.AbstractFactory import AbstractFactory
from factories import ConcreteFactory1, ConcreteFactory2 from creational.abstract_factory.factories import ConcreteFactory1, \
ConcreteFactory2
def client_code(factory: AbstractFactory) -> None: def client_code(factory: AbstractFactory) -> None:

View file

@ -1,7 +1,7 @@
"""Concrete Products are created by corresponding Concrete Factories.""" """Concrete Products are created by corresponding Concrete Factories."""
from AbstractProductA import AbstractProductA from creational.abstract_factory.AbstractProductA import AbstractProductA
from AbstractProductB import AbstractProductB from creational.abstract_factory.AbstractProductB import AbstractProductB
class ConcreteProductA1(AbstractProductA): class ConcreteProductA1(AbstractProductA):

View file

@ -1,4 +1,4 @@
from Builder import Builder from creational.builder.Builder import Builder
class Director: class Director:

View file

@ -0,0 +1,5 @@
"""
Lets you construct complex objects step by step. The pattern allows you to
produce different types and representations of an object using the same
construction code.
"""

View file

@ -1,5 +1,5 @@
from Builder import Builder from creational.builder.Builder import Builder
from products import Product1 from creational.builder.products import Product1
class ConcreteBuilder1(Builder): class ConcreteBuilder1(Builder):

View file

@ -4,8 +4,8 @@ initiates the construction process. The end result is retrieved from the
builder object. builder object.
""" """
from builders import ConcreteBuilder1 from creational.builder.Director import Director
from Director import Director from creational.builder.builders import ConcreteBuilder1
director = Director() director = Director()
builder = ConcreteBuilder1() builder = ConcreteBuilder1()

View file

@ -0,0 +1,4 @@
"""
Provides an interface for creating objects in a superclass, but allows
subclasses to alter the type of objects that will be created.
"""

View file

@ -3,10 +3,9 @@ Concrete Creators override the factory method in order to change the resulting
product's type. product's type.
""" """
from __future__ import annotations from creational.factory_method.ICreator import ICreator
from creational.factory_method.products import ConcreteProduct1, \
from ICreator import ICreator ConcreteProduct2
from products import ConcreteProduct1, ConcreteProduct2
class ConcreteCreator1(ICreator): class ConcreteCreator1(ICreator):

View file

@ -1,5 +1,6 @@
from creators import ConcreteCreator1, ConcreteCreator2 from creational.factory_method.ICreator import ICreator
from ICreator import ICreator from creational.factory_method.creators import ConcreteCreator1, \
ConcreteCreator2
def client_code(creator: ICreator) -> None: def client_code(creator: ICreator) -> None:

View file

@ -2,7 +2,7 @@
Concrete Products provide various implementations of the Product interface. Concrete Products provide various implementations of the Product interface.
""" """
from IProduct import IProduct from creational.factory_method.IProduct import IProduct
class ConcreteProduct1(IProduct): class ConcreteProduct1(IProduct):

View file

@ -0,0 +1,4 @@
"""
Lets you copy existing objects without making your code dependent on their
classes.
"""

View file

@ -39,7 +39,8 @@ class SomeComponent:
# Then, let's clone the object itself, using the prepared clones of the # Then, let's clone the object itself, using the prepared clones of the
# nested objects. # nested objects.
new = self.__class__(self.some_int, some_list_of_objects, some_circular_ref) new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref)
new.__dict__.update(self.__dict__) new.__dict__.update(self.__dict__)
return new return new
@ -60,10 +61,10 @@ class SomeComponent:
# First, let's create copies of the nested objects. # First, let's create copies of the nested objects.
some_list_of_objects = copy.deepcopy(self.some_list_of_objects, memo) some_list_of_objects = copy.deepcopy(self.some_list_of_objects, memo)
some_circular_ref = copy.deepcopy(self.some_circular_ref, memo) some_circular_ref = copy.deepcopy(self.some_circular_ref, memo)
# Then, let's clone the object itself, using the prepared clones of the # Then, let's clone the object itself, using the prepared clones of the
# nested objects. # nested objects.
new = self.__class__(self.some_int, some_list_of_objects, some_circular_ref) new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref)
new.__dict__ = copy.deepcopy(self.__dict__, memo) new.__dict__ = copy.deepcopy(self.__dict__, memo)

View file

@ -1,6 +1,6 @@
import copy import copy
from components import SelfReferencingEntity, SomeComponent from creational.prototype.components import SelfReferencingEntity, SomeComponent
list_of_objects = [1, {1, 2, 3}, [1, 2, 3]] list_of_objects = [1, {1, 2, 3}, [1, 2, 3]]
circular_ref = SelfReferencingEntity() circular_ref = SelfReferencingEntity()

View file

@ -0,0 +1,4 @@
"""
Lets you ensure that a class has only one instance, while providing a global
access point to this instance.
"""

View file

@ -0,0 +1,4 @@
"""
Structural patterns explain how to assemble objects and classes into larger
structures while keeping these structures flexible and efficient.
"""

View file

@ -0,0 +1 @@
"""Allows objects with incompatible interfaces to collaborate."""

View file

@ -0,0 +1,5 @@
"""
Lets you split a large class or a set of closely related classes into two
separate hierarchiesabstraction and implementationwhich can be developed
independently of each other.
"""

View file

@ -1,6 +1,6 @@
from dataclasses import dataclass from dataclasses import dataclass
from IImplementation import Implementation from structural.bridge.IImplementation import Implementation
@dataclass @dataclass

View file

@ -2,7 +2,7 @@
Each Concrete Implementation corresponds to a specific platform and implements Each Concrete Implementation corresponds to a specific platform and implements
the Implementation interface using that platform's API. the Implementation interface using that platform's API.
""" """
from IImplementation import Implementation from structural.bridge.IImplementation import Implementation
class ConcreteImplementationA(Implementation): class ConcreteImplementationA(Implementation):

View file

@ -2,9 +2,9 @@
The client code should be able to work with any pre-configured abstraction- The client code should be able to work with any pre-configured abstraction-
implementation combination. implementation combination.
""" """
from abstractions import Abstraction from structural.bridge.abstractions import Abstraction
from IImplementation import Implementation from structural.bridge.implementations import ConcreteImplementationA, \
from implementations import ConcreteImplementationA, ConcreteImplementationB ConcreteImplementationB
def client_code(abstraction: Abstraction) -> None: def client_code(abstraction: Abstraction) -> None:
@ -23,7 +23,6 @@ abstraction = Abstraction(implementation)
client_code(abstraction) client_code(abstraction)
print("\n") print("\n")
implementation = ConcreteImplementationB() implementation = ConcreteImplementationB()

View file

@ -0,0 +1,4 @@
"""
Lets you compose objects into tree structures and then work with these
structures as if they were individual objects.
"""

View file

@ -1,7 +1,7 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import List from typing import List
from component import Component from structural.composite.component import Component
@dataclass @dataclass

View file

@ -1,4 +1,4 @@
from component import Component from structural.composite.component import Component
class Leaf(Component): class Leaf(Component):

View file

@ -1,6 +1,6 @@
from component import Component from structural.composite.component import Component
from composite import Composite from structural.composite.composite import Composite
from leaf import Leaf from structural.composite.leaf import Leaf
def client_code(component: Component) -> None: def client_code(component: Component) -> None:

View file

@ -0,0 +1,4 @@
"""
Lets you attach new behaviors to objects by placing these objects inside special
wrapper objects that contain the behaviors.
"""

View file

@ -1,4 +1,5 @@
from component import Component from structural.composite.component import Component
class ConcreteComponent(Component): class ConcreteComponent(Component):
""" """
@ -7,4 +8,4 @@ class ConcreteComponent(Component):
""" """
def operation(self) -> str: def operation(self) -> str:
return "ConcreteComponent" return "ConcreteComponent"

View file

@ -1,4 +1,4 @@
from decorator import Decorator from structural.decorator.decorator import Decorator
class ConcreteDecoratorA(Decorator): class ConcreteDecoratorA(Decorator):

View file

@ -1,6 +1,7 @@
from component import Component
from dataclasses import dataclass from dataclasses import dataclass
from structural.decorator.component import Component
@dataclass @dataclass
class Decorator(Component): class Decorator(Component):

View file

@ -1,6 +1,7 @@
from component import Component from structural.decorator.component import Component
from concrete_component import ConcreteComponent from structural.decorator.concrete_component import ConcreteComponent
from concrete_decorators import ConcreteDecoratorA, ConcreteDecoratorB from structural.decorator.concrete_decorators import ConcreteDecoratorA, \
ConcreteDecoratorB
def client_code(component: Component): def client_code(component: Component):

View file

@ -0,0 +1,4 @@
"""
Provides a simplified interface to a library, a framework, or any other complex
set of classes.
"""

View file

@ -0,0 +1,5 @@
"""
Lets you fit more objects into the available amount of RAM by sharing common
parts of state between multiple objects instead of keeping all of the data in
each object.
"""

View file

@ -0,0 +1,5 @@
"""
Lets you provide a substitute or placeholder for another object. A proxy
controls access to the original object, allowing you to perform something either
before or after the request gets through to the original object.
"""