Four authors were written this book that's why the name was given "Gang of Four".
Even though the GoF authors wrote the book in a C++ context, the book remains very relevant to Java programming. C++ and Java are both object-oriented languages.

Let me first define what is design pattern and it's usage in simple words.

What is Design Patterns?

In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. A design pattern isn't a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations.

Uses of Design Patterns

Design patterns can speed up the development process by providing tested, proven development paradigms. Effective software design requires considering issues that may not become visible until later in the implementation. Reusing design patterns helps to prevent subtle issues that can cause major problems and improves code readability for coders and architects familiar with the patterns.

Often, people only understand how to apply certain software design techniques to certain problems. These techniques are difficult to apply to a broader range of problems. Design patterns provide general solutions, documented in a format that doesn't require specifics tied to a particular problem.

In addition, patterns allow developers to communicate using well-known, well-understood names for software interactions. Common design patterns can be improved over time, making them more robust than ad-hoc designs.

Organizing the Catalog to Creational, Structural, or Behavioral

Design patterns are organized into Creational, Structural, or Behavioral purpose.

Creational patterns concern the process of object creation.

Structural patterns deal with the composition of classes or objects.

Behavioral patterns characterize the ways in which classes or objects interact and distribute responsibility.

Creational design patterns

Creational patterns involve object instantiation and all provide a way to decouple a client from the objects it needs to instantiate.

This pattern can be further divided into class-creation patterns and object-creational patterns. While class-creation patterns use inheritance effectively in the instantiation process, object-creation patterns use delegation effectively to get the job done. Click to read creational design patterns.

Proxy Design Pattern - Provide a surrogate or placeholder for another object to control access to it.

Behavioral design patterns

Behavioral pattern is concerned with how classes and objects interact and distribute responsibility.
These design patterns are all about Class's objects communication. Behavioral patterns are those patterns that are most specifically concerned with communication between objects. Click to read behavioral design patterns.

Chain of responsibility - Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along with the chain until an object handles it.

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

Iterator Design Pattern - Accesses the elements of an object sequentially without exposing its underlying representation.

Mediator Design Pattern - Allows loose coupling between classes by being the only class that has detailed knowledge of their methods.

State Design Pattern - Allow an object to alter its behaviour when its internal state changes. The object will appear to change its class.

Strategy Design Pattern - Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.

Template Method Design Pattern - Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

Delegation Pattern - It is a technique where an object expresses certain behavior to the outside but in reality delegates responsibility for implementing that behaviour to an associated object.