Категория Паттерн Описание Применение Конкретный Пример на Java
пример
применения
Порождающие Singleton Обеспечивает Когда нужен Менеджер public class Singleton { private
static Singleton instance;
создание один экземпляр логирования, где
private Singleton() {} public
единственного класса, нужен static Singleton getInstance()
экземпляра например, для единственный { if (instance == null)
класса. конфигурации экземпляр для { instance = new Singleton(); }
или управления записи логов. return instance; } }
подключением к
базе данных.
Factory Определяет Когда создание Фабрика для abstract class Document { public
abstract void open(); } class
Method интерфейс для объектов должно создания
PDFDocument extends Document
создания делегироваться различных типов { public void open() { /* ...
объектов, но подклассам. документов */ } } class WordDocument extends
оставляет (PDF, Word, Document { public void open()
подклассам Excel). { /* ... */ } }
решение о том,
какой класс
создавать.
Abstract Предоставляет Когда система GUI-библиотека, interface GUIFactory { Button
createButton(); } class
Factory интерфейс для должна быть где можно
WinFactory implements GUIFactory
создания семейств независимой от создавать кнопки { public Button createButton()
взаимосвязанных способа и текстовые поля { return new WinButton(); } }
или создания, для разных class OSXFactory implements
взаимозависимых компоновки и операционных GUIFactory { public Button
createButton() { return new
объектов. представления систем. OSXButton(); } }
продуктов.
Builder Разделяет процесс Когда необходим Конструирование class Car { private String
engine; private int wheels; //
создания процесс сложного
Getters and setters } class
сложного объекта поэтапного объекта, CarBuilder { private Car car =
от его создания например, new Car(); public CarBuilder
представления. объекта. автомобиля с setEngine(String engine)
{ [Link](engine); return
различными
this; } public CarBuilder
конфигурациями. setWheels(int wheels)
{ [Link](wheels); return
this; } public Car build()
{ return car; } }
Prototype Создает новые Когда создание Клонирование class Prototype implements
Cloneable { public Prototype
объекты путем объектов дорого объектов в
clone() { try { return
копирования или сложно, и графическом (Prototype) [Link](); }
существующих есть редакторе для catch (CloneNotSupportedException
объектов. необходимость в быстрого e) { return null; } } }
множественных создания копий
экземплярах. фигур.
Структурные Adapter Преобразует Когда Адаптация class Adapter { private
OldInterface old; public
интерфейс одного необходимо старого
Adapter(OldInterface old)
класса в использовать интерфейса к { [Link] = old; } public void
интерфейс, класс с новому newRequest()
ожидаемый несовместимым интерфейсу в { [Link](); } }
клиентами. интерфейсом. системе оплаты.
Bridge Разделяет Когда Графический interface DrawingAPI { void
drawCircle(double x, double y,
абстракцию и ее необходимо интерфейс, где
double radius); } class
реализацию, отделить можно изменять DrawingAPI1 implements DrawingAPI
позволяя изменять абстракцию от ее реализацию { public void drawCircle(double
их независимо реализации. отрисовки, не x, double y, double radius) {
друг от друга. изменяя /* ... */ } } class Circle
{ private double x, y, radius;
абстракцию private DrawingAPI drawingAPI;
формы. public Circle(double x, double y,
double radius, DrawingAPI
drawingAPI) { this.x = x; this.y
= y; [Link] = radius;
[Link] = drawingAPI; }
public void draw()
{ [Link](x, y,
radius); } }
Composite Составляет Когда нужно Файловая interface FileComponent { void
showDetails(); } class FileLeaf
объекты в представлять система, где
implements FileComponent { public
древовидные иерархические директории void showDetails() { /* ...
структуры для структуры могут содержать */ } } class DirectoryComposite
представления сложных файлы и другие implements FileComponent
иерархий «часть- объектов. директории. { private List<FileComponent>
files = new ArrayList<>(); public
целое». void add(FileComponent file)
{ [Link](file); } public void
showDetails() { for
(FileComponent file : files)
{ [Link](); } } }
Decorator Динамически Когда Добавление interface TextComponent { String
formatText(); } class PlainText
добавляет новые необходимо дополнительных
implements TextComponent { public
обязанности добавить функций к String formatText() { return
объектам. обязанности объекту "plain text"; } } class
объекту текстового TextDecorator implements
динамически, не редактора, TextComponent { protected
TextComponent decoratedText;
изменяя его например, public
класс. проверка TextDecorator(TextComponent
орфографии. decoratedText)
{ [Link] =
decoratedText; } public String
formatText() { return
[Link](); } }
class BoldDecorator extends
TextDecorator { public
BoldDecorator(TextComponent
decoratedText)
{ super(decoratedText); } public
String formatText() { return
"<b>" + [Link]() +
"</b>"; } }
Facade Предоставляет Когда требуется Упрощение class GraphicsFacade { private
Graphics graphics; public
унифицированный упростить доступа к
интерфейс к сложную сложной GraphicsFacade() { graphics = new
Graphics(); } public void
группе систему, библиотеке для
drawCircle(int x, int y, int
интерфейсов в предоставив работы с radius)
подсистеме. единый графикой через { [Link]([Link]);
интерфейс. фасадный класс. [Link](x, y,
radius); } }
Flyweight Поддерживает Когда Управление class FlyweightFactory { private
Map<String, Flyweight> flyweights
множество мелких необходимо большими
= new HashMap<>(); public
объектов, делая их эффективно объемами Flyweight getFlyweight(String
доступными через поддерживать графических key) { if (!
совместное множество объектов, таких [Link](key))
использование. мелких объектов. как символы в { [Link](key, new
ConcreteFlyweight(key)); } return
текстовом [Link](key); } }
редакторе. interface Flyweight { void
operation(String extrinsicState);
} class ConcreteFlyweight
implements Flyweight { private
String intrinsicState; public
ConcreteFlyweight(String
intrinsicState)
{ [Link] =
intrinsicState; } public void
operation(String extrinsicState)
{ /* ... */ } }
Proxy Предоставляет Когда нужен Ленивая загрузка interface Image { void display();
} class RealImage implements
суррогатный более объектов,
Image { private String filename;
объект для управляемый например, public RealImage(String filename)
управления или более загрузка больших { [Link] = filename;
доступом к функциональный изображений loadImageFromDisk(); } private
другому объекту. способ доступа к только при void loadImageFromDisk()
{ [Link]("Loading " +
объекту. необходимости. filename); } public void
display()
{ [Link]("Displaying
" + filename); } } class
ProxyImage implements Image
{ private RealImage realImage;
private String filename; public
ProxyImage(String filename)
{ [Link] = filename; }
public void display() { if
(realImage == null) { realImage =
new RealImage(filename); }
[Link](); } }
Поведенческие Chain of Передает запрос Когда несколько Система abstract class Handler
{ protected Handler successor;
Responsibility по цепочке объектов могут обработки
public void setSuccessor(Handler
обработчиков. обработать заявок, где successor) { [Link] =
запрос, но заявки проходят successor; } public abstract void
конкретный через цепочку handleRequest(Request request); }
обработчик различных class ConcreteHandler1 extends
Handler { public void
неизвестен. отделов для handleRequest(Request request)
обработки. { if (canHandle(request)) { //
handle request } else if
(successor != null)
{ [Link](request
); } } }
Command Инкапсулирует Когда нужно Система
запрос как объект, параметризовать обработки
позволяя объекты команд, таких
параметризовать выполняемыми как команды для
клиентов операциями или выполнения
различными поддерживать операций с
запросами. операции, файлами
которые можно (создание,
отменить. удаление).