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)
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)
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)
Посредник(распознаваемый поведенческими методами, использующими экземпляр другого абстрактного / интерфейсного типа (обычно с использованием шаблона command), который делегирует / использует данный экземпляр)
Наблюдатель (или Публикация / Подписка)(распознается по поведенческим методам, которые вызывают метод в экземпляре другого абстрактного / интерфейсного типа, в зависимости от собственного состояния)
Стратегия(распознаваемая поведенческими методами в абстрактном / интерфейсном типе, которая вызывает метод в реализации другого абстрактного / интерфейсного типа, который был передан в качестве аргумента метода в реализацию стратегии)
javax.servlet.http.HttpServlet методы service() и all doXXX() принимают HttpServletRequest и HttpServletResponse , и разработчик должен обработать их (а не получить их в качестве переменных экземпляра!).
javax.servlet.http.HttpServlet все doXXX() методы по умолчанию отправляют в ответ ошибку HTTP 405 "Метод не разрешен". Вы вольны не реализовать ни один из них.
Посетитель(распознается по двум разным абстрактным / интерфейсным типам, в которых определены методы, каждый из которых принимает другой абстрактный / интерфейсный тип; один фактически вызывает метод другого, а другой выполняет с ним желаемую стратегию)
Шаблон наблюдателя на протяжении всего swing (Observable, Observer)
MVC также в swing
Шаблон адаптера: InputStreamReader и OutputStreamWriter ПРИМЕЧАНИЕ: ContainerAdapter, ComponentAdapter, FocusAdapterKeyAdapter, MouseAdapterне являются адаптерами; на самом деле это нулевые объекты. Неудачный выбор имен Sun.
Шаблон декоратора (BufferedInputStream может украшать другие потоки, такие как FilterInputStream)
Шаблон AbstractFactory для AWT Toolkit и подключаемых классов внешнего вида Swing
java.lang.Runtime#getRuntime() является одноэлементным
ButtonGroup для шаблона посредника
Action, AbstractAction может использоваться для разных визуальных представлений для выполнения одного и того же кода -> Шаблон команды
Интернированные строки или CellRender в JTable для шаблона Flyweight (также подумайте о различных пулах - пулах потоков, пулах соединений, пулах объектов EJB - Flyweight на самом деле предназначен для управления общими ресурсами)
Модель событий Java 1.0 является примером цепочки ответственности, как и фильтры сервлетов.
Шаблон итератора в Collections Framework
Вложенные контейнеры в AWT / Swing используют составной шаблон
Менеджеры компоновки в AWT / Swing являются примером стратегии
и, я думаю, многое другое
Ответ 3
Минимальный вес используется с некоторыми значениями Byte, Short, Integer, Long и String .
Фасад используется во многих местах, но наиболее очевидным являются скриптовые интерфейсы.
На ум приходитSingleton - java.lang.Runtime.
Abstract Factory - Также скриптинг и JDBC API.
Команда - отмена / повтор TextComponent.
Интерпретатор - API регулярных выражений (java.util.regex.) и SQL (java.sql.).
Прототип - Не уверен на 100%, учитывается ли это, но я думаю, что clone() метод можно использовать для этой цели.
Ответ 4
RMI основан на прокси.
Должна быть возможность привести один для большинства из 23 шаблонов в GoF:
Абстрактная фабрика: все интерфейсы java.sql получают свои конкретные реализации из JDBC JAR при регистрации драйвера.
Конструктор: java.lang.StringBuilder.
Фабричный метод: XML-фабрики, среди прочего.
Прототип: возможно, clone() , но я не уверен, что куплюсь на это.
Singleton: java.язык.Система
Адаптер: классы адаптеров в java.awt.event, например, WindowAdapter.
Мост: коллекция классов в java.util. Список, реализованный ArrayList.