3 types: creational, structural, behavioral
object creation, keeping flexibility and reusability…
assemble classes into bigger structure while keeping them flexible…
concerns algorithms and assigning responsibility, keeping the implementation not too coupled with the structure…
decoupling between objects by preventing direct method calls and forcing doing so via a mediator object