Modern software design patterns are broadly classified into four categories based on their use: creational, structural, behavioral, and concurrency
A creational pattern abstracts the process of instantiation, separating how objects are created, composed, and represented from the code that relies on them
A structural pattern teaches us how to compose classes and objects to form larger structures.
Behavioral patterns focus on algorithms and the assignment of responsibilities between objects.
Concurrency pattern addresses some aspect of multithreaded programming