Вопрос-ответ

Examples of GoF Design Patterns in Java's core libraries

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

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

Переведено автоматически
Ответ 1

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


Шаблоны создания

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

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

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

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

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


Структурные шаблоны

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

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


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

Composite (recognizeable by behavioral methods taking an instance of same abstract/interface type into a tree structure)

Decorator (recognizeable by creational methods taking an instance of same abstract/interface type which adds additional behaviour)

Facade (recognizeable by behavioral methods which internally uses instances of different independent abstract/interface types)

Flyweight (recognizeable by creational methods returning a cached instance, a bit the "multiton" idea)

Proxy (recognizeable by creational methods which returns an implementation of given abstract/interface type which in turn delegates/uses a different implementation of given abstract/interface type)


Behavioral patterns

Chain of responsibility (recognizeable by behavioral methods which (indirectly) invokes the same method in another implementation of same abstract/interface type in a queue)

Command (recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been encapsulated by the command implementation during its creation)

Interpreter (recognizeable by behavioral methods returning a structurally different instance/type of the given instance/type; note that parsing/formatting is not part of the pattern, determining the pattern and how to apply it is)

Iterator (recognizeable by behavioral methods sequentially returning instances of a different type from a queue)

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

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

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

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

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

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

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

Ответ 2

  1. Шаблон наблюдателя на протяжении всего swing (Observable, Observer)

  2. MVC также в swing

  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. Интернированные строки или CellRender в JTable для шаблона Flyweight (также подумайте о различных пулах - пулах потоков, пулах соединений, пулах объектов EJB - Flyweight на самом деле предназначен для управления общими ресурсами)

  10. Модель событий Java 1.0 является примером цепочки ответственности, как и фильтры сервлетов.

  11. Шаблон итератора в Collections Framework

  12. Вложенные контейнеры в AWT / Swing используют составной шаблон

  13. Менеджеры компоновки в AWT / Swing являются примером стратегии

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

Ответ 3

  1. Минимальный вес используется с некоторыми значениями Byte, Short, Integer, Long и String .

  2. Фасад используется во многих местах, но наиболее очевидным являются скриптовые интерфейсы.

  3. На ум приходитSingleton - java.lang.Runtime.

  4. Abstract Factory - Также скриптинг и JDBC API.

  5. Команда - отмена / повтор TextComponent.

  6. Интерпретатор - API регулярных выражений (java.util.regex.) и SQL (java.sql.).

  7. Прототип - Не уверен на 100%, учитывается ли это, но я думаю, что clone() метод можно использовать для этой цели.

Ответ 4

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

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


  1. Абстрактная фабрика: все интерфейсы java.sql получают свои конкретные реализации из JDBC JAR при регистрации драйвера.

  2. Конструктор: java.lang.StringBuilder.

  3. Фабричный метод: XML-фабрики, среди прочего.

  4. Прототип: возможно, clone() , но я не уверен, что куплюсь на это.

  5. Singleton: java.язык.Система

  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. Минимальный вес: целое число, символ и т.д.

  12. Прокси: пакет java.rmi

  13. Цепочка ответственности: фильтры сервлетов

  14. Команда: Пункты меню Swing

  15. Интерпретатор: Нет непосредственно в JDK, но JavaCC, безусловно, использует это.

  16. Итератор: java.util.Интерфейс итератора; яснее не скажешь.

  17. Посредник: JMS?

  18. Памятка:

  19. Observer: java.util.Observer / Observable (правда,сделано плохо)

  20. Состояние:

  21. СТРАТЕГИИ:

  22. Шаблон:

  23. Посетитель:

Я не могу вспомнить примеров в Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Для этого и существует edit.

oop java