All original content is created in Ukrainian. Not all content has been translated yet. Some posts may only be available in Ukrainian.Learn more
This content has been automatically translated from Ukrainian.
Design pattern in programming is a general solution to typical problems that arise during software development. It is an architectural approach that provides a standardized way to solve specific problems or tasks in programming.
Design patterns help developers create software that is flexible, easily extensible, and easy to maintain. They address specific problems without the need to create new solutions from scratch. Using design patterns helps facilitate understanding and maintenance of code, promotes the use of best practices (best practice), and improves the team's ability to collaborate.
Design patterns can be classified into three main categories.

Creational patterns

Simplify the process of creating objects. This category includes, for example, Singleton, Factory Method, Abstract Factory.

Structural patterns

Simplify the organization of program structures and interactions between components. These include, for example, Adapter, Composite, Proxy.

Behavioral patterns

Describe ways to organize interactions between objects. These include, for example, Observer, Strategy, Command.
The application of design patterns contributes to the expansion and maintenance of code, as well as facilitates communication among team members of developers. When a developer encounters a typical problem, they can apply the appropriate design pattern, making their code more structured and maintainable.
There are many design patterns that are suitable for solving various tasks. A good practice is to analyze the task or problem and determine which pattern fits best in this particular case. It is also important to remember best practices. Below, we will look at the most popular patterns and their areas of application. For a deeper understanding, each pattern should be studied separately. This note provides only a very brief overview (a few sentences).

Factory Method

Defines an interface for creating objects but leaves the choice to subclasses regarding which class to instantiate.
A classic example is the creation of graphical elements (buttons, input fields) in graphical interfaces.

Abstract Factory

Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
An example is creating graphical elements (buttons, input fields, windows) with a specific style or theme.

Builder

Separates the construction process of a complex object from its representation, allowing the same construction process to create different representations.
An example is creating objects with complex configurations, such as a car object with various options.

Prototype

Allows creating new objects by copying existing objects, providing flexibility and speed in object creation.
An example is creating copies of documents, graphical objects, etc.

Singleton

Ensures that a class has only one instance and provides a global point of access to it.
An example is a class used to store global settings.

Adapter

Allows an interface to work with another incompatible interface.
An example is adapting interfaces of different libraries or classes for convenient interaction.

Bridge

Separates abstraction from implementation, allowing them to vary independently.
An example is separating a graphical interface from its implementation to be able to change both parts independently.

Composite

Combines a group of objects into a tree structure to work with them as if they were a single object.
An example is building a tree hierarchy of a file system.

Decorator

Allows dynamically adding new functionality to objects.
An example is extending the functionality of an object, for instance, adding decorators to graphical objects.

Facade

Provides a simple and unified interface to a large group of interfaces in a subsystem.
An example is creating a facade for complex libraries or subsystems for convenient use.

Flyweight

Allows objects to share common parts to save memory.
An example is creating lightweight objects for efficient resource usage.

Proxy

Allows using special substitute objects instead of real ones. These objects intercept calls addressed to the original object, allowing custom code to be inserted before or after passing the call to the original object.
An example is using a proxy object to control access to a heavy object, such as a large image.

Chain of Responsibility

Allows passing requests to handler objects, forming a chain.
An example is processing requests at different levels of a system until the request is handled.

Command

Encapsulates a request as an object, allowing parameterization of clients with requests, objects, and queues.
An example is implementing a request queue.

Iterator

Provides a way to sequentially access objects without exposing their internal structure.
An example is iterating over elements of a list or collection without revealing their internal structure.

Mediator

Defines an object that encapsulates how a set of objects interact.
An example is creating a mediator to manage the interaction of a large number of components in a graphical interface.

Memento

Provides the ability to store and restore the previous state of an object.
An example is saving the state of a game so that a player can return to previous points.

Observer

Defines a dependency between one or more objects and the state of another object.
An example is implementing subscriptions for updates in graphical interfaces or notification systems.

State

Allows an object to change its behavior when its state changes.
An example is implementing a state machine to control an object's behavior based on conditions. For example, the behavior of NPC depending on its state and environment.

Strategy

Defines a family of algorithms and makes them interchangeable.
An example is choosing a sorting algorithm depending on the needs of a specific case.

Template Method

Defines the overall structure of an algorithm, allowing subclasses to modify some steps of the algorithm.
An example is implementing a template for creating similar algorithms.

Visitor

Allows defining a new operation without changing the classes of objects where it is used.
An example is implementing a visitor to process different types of objects in a complex system.

Grouped patterns by main categories

Creational patterns:
  • Factory Method
  • Abstract Factory
  • Builder
  • Prototype
  • Singleton
Structural patterns:
  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy
Behavioral patterns:
  • Chain of Responsibility
  • Command
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Template Method
  • Visitor

This post doesn't have any additions from the author yet.

07 Dec 08:13

Visibility control in Ruby (public, private, and protected)

meme code
meme code@memecode
07 Dec 08:25

What is OOP (object-oriented programming)?

meme code
meme code@memecode
09 Dec 12:00

What is inheritance in Ruby? Examples of bad and good inheritance.

meme code
meme code@memecode
09 Dec 12:15

What is best practice in programming?

meme code
meme code@memecode
09 Dec 12:21

What is polymorphism? An example of using polymorphism in Ruby.

meme code
meme code@memecode
09 Dec 12:46

Що таке патерн/шаблон проєктування?

meme code
meme code@memecode
10 Dec 14:18

What is a client and a server? What is the interaction mechanism between the client and the server?

meme code
meme code@memecode
18 Dec 08:25

What is DNS? What is DNS used for?

meme code
meme code@memecode
18 Dec 08:44

What is a domain (domain name)?

meme code
meme code@memecode
19 Dec 18:15

What are SSL and TLS? What is the difference?

meme code
meme code@memecode
19 Dec 18:17

What is the HTTP protocol? What is the difference between HTTP and HTTPS?

meme code
meme code@memecode
19 Dec 19:10

What is a "man-in-the-middle" attack?

meme code
meme code@memecode