Design patterns

From Basics of the Unix Philosophy

The only way to write complex software that won't fall on its face is to hold
its global complexity down — to build it out of simple parts connected by
well-defined interfaces, so that most problems are local and you can have some
hope of upgrading a part without breaking the whole.
  • Design patterns by refactoring guru
  • The caching antipattern
  • Inversion of Control Containers and the Dependency Injection pattern
  • Principle of last astonishment and python by Armin Ronacher
  • Single responsability principle pdf: THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE.
  • Law of Demeter
    • Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
    • Each unit should only talk to its friends; don't talk to strangers.
    • Only talk to your immediate friends.
    • Single Responsibility Principle
    • Open Closed Princple
    • Liskov's Substitutablilty Principle
    • Interface Segregation Principle
    • Dependency Inversion Principle
  • A Pythonic Guide to SOLID Design Principles


inheritance vs object composition

  • Aggregation: object A contains objects B; B can live without A.
  • Composition: object A consists of objects B; A manages life cycle of B; B can’t live without A.


How objects can be created.

Abstract factory


In this pattern you build an object step by step. Its primary scope it's to avoid gigantic constructors (with a lot of arguments).

Factory method

Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.


It creates objects via cloning.


It creates, enforces and provides the existence of a single instance of a specific class


How to form larger structures.


This is a structural design pattern that allows objects with incompatible interfaces to collaborate.


Decouples an abstraction from its implementation so that the two can vary indipendently. At first look could appear that is equal to dependency injection but you could consider it a Software Architecture Pattern (but still not a design one), in the sense that it's a common way of addressing a series of Architectural concerns (testability, configurability, modularity, etc).

Bridge also allows both sides on the bridge to evolve and change independently without affecting the other. This is because the Bridge isolates both sides from each other. A particular case could be the PIMPL idiom a way of hiding the implementation, primarily to break compilation dependencies


In a model with a tree-like structure you can use this pattern where you compose the single components together.


Wraps the object with new behaviours. In practice you are adding a layer in front of the original object.


It simplifies the interface used to interact with a set of models.


Factorizes repeated instances.

Similar to composition but here the sharing is the principal point of the pattern. Like singleton but the flyweight is unmutable.


It is a design pattern that 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.


How responsabilities can be assigned to objects.


It lets you pass requests along a chain of handlers. Upon receiving a request, each handler decides either to process the request or to pass it to the next handler in the chain.