it-swarm.com.ru

Примеры шаблонов проектирования GoF в основных библиотеках Java

Я изучаю GoF Java Design Patterns и хочу увидеть примеры из реальной жизни. Каковы хорошие примеры этих шаблонов проектирования в основных библиотеках Java?

672
unj2

Вы можете найти обзор многих шаблонов дизайна в Википедия . Также упоминается, какие шаблоны упоминаются GoF. Я суммирую их здесь и попытаюсь назначить как можно больше реализаций шаблонов, которые можно найти в API Java SE и Java EE.


Творческие образцы

Абстрактная фабрика (распознается креативными методами, возвращающими саму фабрику, которая, в свою очередь, может быть использована для создания другого абстрактного/интерфейсного типа)

Builder (распознается креативными методами, возвращающими сам экземпляр)

Заводской метод (распознается креативными методами, возвращающими реализацию абстрактного/интерфейсного типа)

прототип (распознается креативными методами, возвращающими другой экземпляр самого себя с теми же свойствами)

Singleton (распознается креативными методами, возвращающими один и тот же экземпляр (обычно самого себя) каждый раз)


Структурные схемы

адаптер (распознаваемый креативными методами, берущий экземпляр другого абстрактного/интерфейсного типа и возвращающий реализацию собственного/другого абстрактного/интерфейсного типа, который декорирует/переопределяет данный экземпляр)

Bridge (распознаваемый креативными методами, берущий экземпляр другого абстрактного/интерфейсного типа и возвращающий реализацию собственного абстрактного/интерфейсного типа, который делегирует/использует данный экземпляр)

  • Никто еще не приходит в голову. Фантастическим примером будет new LinkedHashMap(LinkedHashSet<K>, List<V>), который возвращает неизменяемую связанную карту, которая не клонирует элементы, но использует их. Однако методы Java.util.Collections#newSetFromMap() и singletonXXX() близки.

композитный (распознается поведенческими методами, берущими экземпляр того же абстрактного/интерфейсного типа в древовидную структуру)

декоратор (распознается творческими методами, использующими экземпляр того же абстрактного/интерфейсного типа, который добавляет дополнительное поведение)

Фасад (распознается поведенческими методами, которые внутренне используют экземпляры различных независимых абстрактных/интерфейсных типов)

мухи (распознается креативными методами, возвращающими кешированный экземпляр, немного "многотонная" идея)

прокси (распознаваемый креативными методами, который возвращает реализацию данного абстрактного/интерфейсного типа, который в свою очередь делегирует/использует различную реализацию данного аннотация/тип интерфейса)


Поведенческие модели

Цепочка ответственности (распознается поведенческими методами, которые (косвенно) вызывают тот же метод в другой реализации того же абстрактного/интерфейсного типа в очереди)

Command (распознается поведенческими методами в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был инкапсулирован реализацией команды при ее создании)

интерпретатор (распознается поведенческими методами, возвращающими структурно другой экземпляр/тип данного экземпляра/типа; обратите внимание, что синтаксический анализ/форматирование не является частью шаблона, определяя шаблон и способ его применения это)

итератор (распознается поведенческими методами, последовательно возвращающими экземпляры другого типа из очереди)

Посредник (распознается поведенческими методами, берущими экземпляр другого абстрактного/интерфейсного типа (обычно используя шаблон команды), который делегирует/использует данный экземпляр)

Memento (распознается поведенческими методами, которые внутренне изменяют состояние целого экземпляра)

Наблюдатель (или Опубликовать/Подписаться) (распознается поведенческими методами, которые вызывают метод для экземпляра другого абстрактного/интерфейсного типа, в зависимости от собственного состояния)

государство (распознается поведенческими методами, которые изменяют свое поведение в зависимости от состояния экземпляра, которым можно управлять извне)

Стратегия (распознается поведенческими методами в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был передан в как аргумент метода в реализации стратегии)

шаблонный метод (распознается поведенческими методами, которые уже имеют поведение "по умолчанию", определенное абстрактным типом)

Посетитель (распознаваемый двумя различными абстрактными/интерфейсными типами, для которых определены методы, которые принимают каждый другой абстрактный/интерфейсный тип; вызывает метод другого, а другой выполняет на нем желаемую стратегию)

3064
BalusC
  1. Шаблон наблюдателя на протяжении всего свинга (Observable, Observer)
  2. MVC также в разгаре
  3. Шаблон адаптера: InputStreamReader и OutputStreamWriter ПРИМЕЧАНИЕ. ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter являются не адаптерами; они на самом деле нулевые объекты. Плохой выбор имен от Sun.
  4. Шаблон декоратора (BufferedInputStream может украшать другие потоки, такие как FilterInputStream)
  5. Шаблон AbstractFactory для AWT Toolkit и подключаемых классов Swing.
  6. Java.lang.Runtime#getRuntime() is Singleton
  7. ButtonGroup для паттерна посредника
  8. Action, AbstractAction может использоваться для разных визуальных представлений для выполнения одного и того же кода -> Шаблон команды
  9. Interned Strings или CellRender в JTable for Flyweight Pattern (также подумайте о различных пулах - Пулы потоков, пулы соединений, пулы объектов EJB - Flyweight действительно об управлении общими ресурсами)
  10. Модель событий Java 1.0 является примером цепочки ответственности, как и фильтры сервлетов.
  11. Шаблон итератора в платформе коллекций
  12. Вложенные контейнеры в AWT/Swing используют шаблон Composite.
  13. Менеджеры по раскладке в AWT/Swing являются примером стратегии

и многое другое, я думаю,

102
jitter
  1. Легкий вес используется с некоторыми значениями Byte, Short, Integer, Long и String.
  2. Фасад используется во многих местах, но наиболее очевидным является интерфейс сценариев.
  3. Одиночка - Java.lang.Runtime приходит на ум.
  4. Абстрактная Фабрика - Также Сценарии и JDBC API.
  5. Команда - Отмена/Повторить текстового компонента.
  6. Переводчик - API RegEx (Java.util.regex .) и SQL (Java.sql.).
  7. Прототип - Не уверен на 100%, если это количество, но я думаю, что метод clone() может быть использован для этой цели.
48
NawaMan

RMI основан на Прокси.

Должна быть возможность процитировать один из 23 шаблонов в GoF:

  1. Абстрактная фабрика: все интерфейсы Java.sql получают свои конкретные реализации из JDBC JAR при регистрации драйвера.
  2. Строитель: Java.lang.StringBuilder.
  3. Фабрика Метод: фабрики XML, среди других.
  4. Прототип: Может быть, clone (), но я не уверен, что покупаю это.
  5. Синглтон: Java.lang.System
  6. Адаптер: классы адаптера в Java.awt.event, например, WindowAdapter.
  7. Мост: Коллекция классов в Java.util. Список реализован ArrayList.
  8. Композитный: Java.awt. Java.awt.Component + Java.awt.Container
  9. Декоратор: по всему пакету Java.io.
  10. Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, области сеанса и аналогичных операций.
  11. Flyweight: целое число, символ и т.д.
  12. Прокси: пакет Java.rmi
  13. Цепочка ответственности: фильтры сервлетов
  14. Команда: Swing пункты меню
  15. Интерпретатор: Нет непосредственно в JDK, но JavaCC, безусловно, использует это.
  16. Iterator: интерфейс Java.util.Iterator; не может быть яснее, чем это.
  17. Посредник: JMS?
  18. Memento:
  19. Наблюдатель: Java.util.Observer/Observable (правда, плохо)
  20. Государственный:
  21. Стратегия:
  22. Шаблон:
  23. Посетитель:

Я не могу вспомнить примеры в Java для 10 из 23, но я посмотрю, смогу ли я добиться большего успеха завтра. Это то, что редактировать для.

40
duffymo

Шаблон Абстрактная фабрика используется в разных местах. Например, DatagramSocketImplFactory, PreferencesFactory. Есть много других - поискать в Javadoc интерфейсы, в названии которых есть слово "Фабрика".

Также есть немало примеров фабричной модели.

26
uckelman

Несмотря на то, что с этим часами у меня сломались часы, XML-интерфейс Java часто использует Factory. Я имею в виду, просто посмотрите на это:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...и так далее и тому подобное.

Кроме того, различные буферы (StringBuffer, ByteBuffer, StringBuilder) используют Builder.

21
Esko

Java.util.Collection # Iterator является хорошим примером фабричного метода. В зависимости от конкретного подкласса Collection, который вы используете, он создаст реализацию Iterator. Поскольку и суперкласс Factory (Collection), и созданный Iterator являются интерфейсами, его иногда путают с AbstractFactory. Большинство примеров для AbstractFactory в принятом ответе (BalusC) являются примерами Factory , упрощенной версии Factory Method, которая не является частью оригинальных шаблонов GoF. В Facory иерархия классов фабрики свернута, и фабрика использует другие средства для выбора продукта, который будет возвращен.

  • Абстрактная Фабрика

Абстрактная фабрика имеет несколько фабричных методов, каждый из которых создает свой продукт. Продукты, произведенные на одном заводе, предназначены для совместного использования (ваш принтер и картриджи должны быть с одного (абстрактного) завода). Как упомянуто в ответах выше, семейства компонентов графического интерфейса пользователя AWT, отличающихся от платформы к платформе, являются примером этого (хотя его реализация отличается от структуры, описанной в Gof).

20
Catweazle