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

706

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

Теги:
oop
design-patterns
java-api

7 ответов

2720
Лучший ответ

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


Создание шаблонов

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

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

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

Прототип (распознаваемый с помощью методов создания, возвращающих разные сам с теми же свойствами)

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


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

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

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

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

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

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

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

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

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


Поведенческие шаблоны

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

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

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

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

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

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

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

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

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

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

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

  • 21
    впечатляет .. :) +1. javax.lang.model.element определяет посетителей;) Я не совсем уверен, doXXX ли doXXX и doFilter «стратегиями».
  • 1
    @ Божо: Спасибо за пример посетителя! (этот весь API на самом деле является новым для меня, кстати). В doXXX() и doFilter() вы в основном пишете алгоритм стратегии один. Сервер загружает и выполняет его.
Показать ещё 33 комментария
93
  • Шаблон наблюдателя в течение всего колебания (Observable, Observer)
  • MVC также в качелях
  • Схема адаптера: InputStreamReader и OutputStreamWriter  ПРИМЕЧАНИЕ: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter не являются адаптерами; они фактически являются объектами Null. Плохой выбор названия для Sun.
  • Рисунок декоратора (BufferedInputStream может украшать другие потоки, такие как FilterInputStream)
  • AbstractFactory Pattern для AWT Toolkit и Swing подключаемых классов look-and-feel.
  • java.lang.Runtime#getRuntime() - Singleton
  • ButtonGroup для шаблона медиатора
  • Action, AbstractAction может использоваться для разных визуальных представлений для выполнения того же кода → Шаблон команды
  • Интернированные строки или CellRender в JTable для шаблона Flyweight (Также подумайте о различных пулах - пулы потоков, пулы подключений, пулы объектов EJB - Flyweight действительно посвящен управлению общими ресурсами).
  • Модель событий Java 1.0 является примером цепочки ответственности, а также фильтров сервлетов.
  • Итератор в структуре коллекций
  • Вложенные контейнеры в AWT/Swing используют композитный шаблон
  • Менеджеры макетов в AWT/Swing являются примером стратегии

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

  • 42
    java.lang.Math (6th) не одноэлементный, у вас нет экземпляра для начала, все статично. Это не синглтон
  • 1
    Спасибо за совет по MouseAdapter. Я нашел это объяснение: stackoverflow.com/questions/9244185/…
50
  • Flyweight используется с некоторыми значениями Byte, Short, Integer, Long и String.
  • Фасад используется во многих местах, но наиболее очевидными являются интерфейсы Scripting.
  • Singleton - java.lang.Runtime приходит на ум.
  • Аннотация Factory - также скриптинг и JDBC API.
  • Команда - Отменить/Вернуть TextComponent.
  • Интерпретатор - RegEx (java.util.regex.) и SQL (java.sql.) API.
  • Прототип - не 100% уверен, что этот счетчик, но я думаю, что метод clone() может быть использован для этой цели.
  • 1
    Что касается шаблона Flyweight : это могут быть разные менеджеры компоновки из пакетов java.awt и java.swing . Действительно, они имеют почти идентичные внутренние атрибуты, а внешние атрибуты - это разные компоненты пользовательского интерфейса, которые они выкладывают в форме пользовательского интерфейса.
  • 0
    @NawaMan Вы сказали 5. Командный текст Отменить / Повторить. Я думаю, что это сувенир, а не команда. Или, скорее всего, оба.
42

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

Должна быть указана одна из них для большинства 23 шаблонов в GoF:

  • Аннотация Factory: интерфейсы java.sql все получают свои конкретные реализации из JDBC JAR при регистрации драйвера.
  • Builder: java.lang.StringBuilder.
  • Factory Метод: XML-заводы, среди прочих.
  • Прототип: Возможно, clone(), но я не уверен, что я его покупаю.
  • Синглтон: java.lang.System
  • Адаптер: классы адаптера в java.awt.event, например, WindowAdapter.
  • Мост: классы коллекции в java.util. Список реализован ArrayList.
  • Композитный: java.awt. java.awt.Component + java.awt.Container
  • Декоратор: весь пакет java.io.
  • Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, сеанса и подобных операций.
  • Вес Flyweight: целое число, символ и т.д.
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: элементы меню Swing
  • Интерпретатор: нет прямо в JDK, но JavaCC, безусловно, использует это.
  • Итератор: интерфейс java.util.Iterator; не может быть яснее, чем это.
  • Посредник: JMS?
  • Memento:
  • Наблюдатель: java.util.Observer/Observable (плохо сделано, хотя)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:

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

25

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

Также имеется немало примеров шаблона Factory.

21

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

  • Аннотация Factory

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

20

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

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

... и т.д. и т.д.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню