Design Patterns

"Design patterns provide a common vocabulary and a shared understanding of best practices among developers, helping to ensure consistency and
quality in the development process."

Factory Method Design Pattern
Defines an interface for creating objects in a superclass, but lets subclasses alter the
type of objects that will be created.

Command Design Pattern
Encapsulates a request as an object, thereby letting you parameterize clients with different requests, queue
or log requests, and support undoable operations.

Decorator Design Pattern
Attaches additional responsibilities to an object dynamically, without affecting
other objects.

Singleton Design Pattern
Ensures that a class has only one instance, with a global point of access to it.

Observer Design Pattern
Defines a one-to-many dependency between objects, so that when one object changes state, all its dependents are notified
and updated automatically.

Template Method Design Pattern
Defines the steps of an algorithm and allows subclasses to provide their own implementations.

Chain of Responsibility Design Pattern
Behavioral design pattern that is used to decouple the
sender of a request from its receiver

Dependency Injection Design Pattern
Components are given dependencies through method arguments or constructors, rather than creating the dependencies themselves.

S.O.L.I.D.
Software Design Principles

Single Responsibility Design Pattern
States that a class should have one and only one reason to change

Open Closed Design Pattern
The Open Closed Principle (OCP) states that a class should be open for extension but closed for modification. 

Liskov Substitution Design Pattern
Objects of a superclass should be
able to replace objects of a subclass, without altering the correctness of the program.

Interface Segregation Design Pattern
clients should not be forced to depend on interfaces they do not use

Dependency Inversion Design Pattern
high-level modules should not depend on low-level modules, but rather both should depend on abstractions

JavaScript Design Patterns

"If you've used a solution that is not a unique solution to solve a challenge that is in of itself a unique challenge, then you have utilized the power of a JavaScript design pattern."

PHP Design Patterns

Design patterns are typical solutions to common problems

in software design. Each pattern is like a blueprint

that you can customize to solve a particular

design problem in your code.

Benefits of patterns

Patterns are a toolkit of solutions to common problems in software design. They define a common language that helps your team communicate more efficiently.


Classification

Design patterns differ by their complexity, level of detail and scale of applicability. In addition, they can be categorized by their intent and divided into three groups.


Criticism of patterns

Are patterns as good as advertised? Is it always possible to use them? Can patterns sometimes be harmful?


History of patterns

The concept of design patterns in software engineering has its roots in architecture and civil engineering. In the mid-1960s, architect Christopher Alexander developed the concept of design patterns as a way to describe the common solutions that arose in building design.


In the late 1980s and early 1990s, software engineers and architects began to adapt this concept to software design. In the famous book "Design Patterns: Elements of Reusable Object-Oriented Software," the authors identified 23 commonly occurring software design problems and provided solutions for each in the form of a design pattern.


Since then, design patterns have become a fundamental part of software engineering and are widely used by developers and teams to solve common software design problems. Design patterns provide a common vocabulary and shared understanding of best practices among developers, helping to ensure consistency and quality in the development process. They also make it easier to maintain and evolve code over time by providing a clear and flexible structure.


Today, design patterns continue to be an important part of software engineering, and the concept has been extended to include patterns for other aspects of software development, such as security, performance, and testing. The popularity of design patterns shows no sign of fading, and they remain an essential tool for software engineers looking to build high-quality, maintainable software systems.


In conclusion, design patterns in software engineering have a rich history and continue to be an important tool for software engineers today. By providing solutions to common software design problems, they help ensure consistency and quality in the development process and make it easier to maintain and evolve code over time.