Паттерны проектирования в Java
это описание проблем, которые встречаются при написании объектно-ориентированного кода, а так же примеры решения этих проблем.
Паттерны создания объектов
Singleton - обеспечиваем существование в системе ровно одного экземпляра некоторого класса;
Factory Method - делегируем процесс создания объектов классам-наследникам;
Prototype - клонируем объекты на основании некоторого базового объекта;
Builder - отделяем процесс создания комплексного объекта от его представления;
Abstract Factory - описываем сущность для создания целых семейств взаимосвязанных объектов.
Singleton
public final class Singleton {
private static Singleton _instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
С двойной проверкой:
public final class Singleton {
private static volatile Singleton _instance = null;
private Singleton() {} public static synchronized Singleton getInstance() {
if (_instance == null)
synchronized (Singleton.class) {
if (_instance == null)
_instance = new Singleton();
}
return _instance;
}
}
с ленивой инициализацией:
public final class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton _instance = new Singleton();
}public static Singleton getInstance() {
return Holder._instance;
} }Factory Method
делегирует создание объектов наследникам родительского класса
public abstract class AbstractWriter {
public abstract void write(Object context);
}
public class ConcreteFileWriter extends AbstractWriter {
public void write (Object context) {
// method body
}
}
public class ConcreteXmlWriter extends AbstractWriter {
public void write (Object context) {
// method body
}
}
public class FactoryMethod {
public AbstractWriter getWriter(Object object) {
AbstractWriter writer = null;
if (object instanceof File) {
writer = new ConcreteFileWriter();
} else if (object instanceof Document) {
writer = new ConcreteXmlWriter();
}
return writer;
}
}Простая фабрика ///возвращает обьект по типу и все
Фабричный метод////добавление к фабрике интерфейса, в котором можно описать функциональные методы
абстрактная метод Через интерфейс вызывается
фабрика которая через интерфейс
создаёт объекты и наследует
Prototype
позволяет создавать новые объекты на основе некоторого объекта-прототипа при этом совсем не обязательно знать как необходимый объект устроен.
public class ComplicatedObject implements Copyable {
public enum Type {
ONE, TWO
}
public ComplicatedObject copy() {
return new ComplicatedObject();
}Builder
фактори завернут в фактори
class BuilderExample {
public static void main(String[] args) {
Director director = new Director();
ComputerBuilder cheapComputerBuilder = new CheapComputerBuilder();director. setComputerBuilder(cheapComputerBuilder);///закинуть детали в обьект director. constructComputer();///собрать из деталей обьект Computer computer = director.getComputer(); ///получить обьект } }
Adapter
в разных ситуациях - работают разные интрефейсы…If else спрятать в
отдельный класс с входными данными
Разница между Адаптером и Фасадом
. Facade определяет новый интерфейс, в то время как Адаптер использует существующие интерфейсы.
Facade
является неким интерфейсом, сочетающим в себе только необходимую функциональность в удобном для пользователя виде.Так можно скрыть реализацию сложных частей кода, уменьшить количество зависимостей от внешней библиотеки и, наконец, работать со множеством объектов через прозрачный и удобный интерфейс. Это, в свою очередь, гарантирует более качественную и простую поддержку всей систем
decorator
В классе-декораторе описывается схожее
поведение в разных методах…а исполняющий
класс в разных ситуациях просто вызывает
методами это поведение(пример - когда какого цвета кнопка). динамически добавляем новую функциональность некоторому объекту, сохраняя его интерфейс;
Proxy -
создаем объект, который перехватывает вызовы к другому объекту;
Strategy -
в разных ситуациях - разное
поведение…If else спрятать в
отдельный класс с входными данными
command
Заворачивает запрос в новый обьект наполняя функционалом…например команда ввода текста завернутая в обьект с функцией отмены, который можно куда то передать
public abstract class Command {
public Editor editor;
private String backup;
Command(Editor editor) {
this.editor = editor;
} void backup() {
backup = editor.textField.getText();
}public void undo() {
editor.textField.setText(backup);
}
public abstract boolean execute(); }