patterns Flashcards
Паттерны проектирования в 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(); }