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

672

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

unj2
источник

Ответы:

3229

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


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

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

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

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

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

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


Структурные узоры

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

BalusC
источник
23
впечатляет .. :) +1. javax.lang.model.elementопределяет посетителей;) Я не совсем уверен в том , doXXXи doFilterв «стратегии».
Божо
16
Упомянутые компоновщики, например StrinbgBuilder, не являются примером для шаблона компоновщика. Однако очень распространенная ошибка - считать их строителями (так что на самом деле вы не виноваты ^ _ ^)
Angel O'Sphere
77
@BalusC, у меня есть вопрос к тебе. Вы читали ВЕСЬ исходный код Java и JSF?
Тапас Бозе
20
@Tapas: я не читал все, только части, которые мне были нужны, или мне было просто любопытно, как «они» это делали.
BalusC
7
Большинство примеров в разделе «Метод фабрики» являются примерами «статической фабрики», которая не является шаблоном GoF. Неправильно.
кольцо на предъявителя
107
  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() Синглтон
  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 являются примером стратегии

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

джиттер
источник
1
Спасибо за совет по MouseAdapter. Я нашел это объяснение: stackoverflow.com/questions/9244185/…
Линкольн
Обратите внимание, что Swing основан исключительно на MVC. Он свел View и Controller в один класс.
Матиас Браун
51
  1. Flyweight используется с некоторыми значениями Byte, Short, Integer, Long и String.
  2. Фасад используется во многих местах, но наиболее очевидным является интерфейс сценариев.
  3. Синглтон - java.lang. Время приходит на ум.
  4. Абстрактная Фабрика - Также Сценарии и JDBC API.
  5. Команда - Отмена / Повторить TextComponent.
  6. Интерпретатор - RegEx (java.util.regex. ) И SQL (java.sql. ) API.
  7. Прототип - Не уверен на 100%, если это количество, но я думаю, что clone()метод может быть использован для этой цели.
оборота НаваМан
источник
1
Что касается шаблона Flyweight : это могут быть разные менеджеры по раскладке java.awtи java.swingпакеты. Действительно, они имеют почти идентичные внутренние атрибуты, а внешние атрибуты - это разные компоненты пользовательского интерфейса, которые они выкладывают в форме пользовательского интерфейса.
Виталий
@NawaMan Вы сказали 5. Командный текст Отменить / Повторить. Я думаю, что это сувенир, а не команда. Или, скорее всего, оба.
Кот Стимпсона
Не могли бы вы помочь мне в связанном вопросе - stackoverflow.com/questions/61284856/… . Я использовал шаблон команды в этом простом примере, но я не уверен, что это правильный способ решения моей проблемы.
Том Джо
42

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, но я посмотрю, смогу ли я добиться большего успеха завтра. Это то, что редактировать для.

duffymo
источник
28

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

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

uckelman
источник
22

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

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

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

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

Эско
источник
21

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

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

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

Catweazle
источник