Design Patterns are a collection of logical models adopted for solving recurrent problems which are observed during the process of software development. Patterns are not dealing with core algorithms adopted by the programs but are instead providing reusable best practise solutions for a modern software design. For this reason algorithms are essential for computational efficiency, and patterns are critical for building scalable architectural solutions.
In Object Oriented Programming Patterns typically show relationships and interactions between classes and objects. In this book we will discuss three classes of Design patterns:
- 1) Creational patterns, which create objects on your behalf rather than instantiating them directly.
- 2) Structural patterns, which compose interfaces by leveraging inheritance. The composition of objects allows to create new functionalities, simplify interfaces, adapt heterogeneous objects, improve performances and reduce complexity.
- 3) Behavioural patterns, which are used to describe interaction and communication among objects. Behavioural patterns are also used to handle the internal state and the internal activities of each object.
Design Patterns started to be adopted in Computer Science after the publication of the book “Design Patterns: Elements of Reusable Object-Oriented Software” by the so-called "Gang of Four" (Gamma et al.)
·  Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2.