Приклади шаблонів дизайну GoF в основних бібліотеках Java


672

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

Відповіді:


3229

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


Творчі зразки

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

Builder (впізнаваний за методами креації, що повертає сам екземпляр)

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

Прототип (розпізнається методами креації, повертаючи інший екземпляр себе з тими ж властивостями)

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


Структурні структури

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

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

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

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

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

Фасад (впізнаваний за поведінковими методами, який внутрішньо використовує екземпляри різних незалежних абстрактних / типів інтерфейсу)

Легка вага (впізнаваний за методами творчості, що повертає кешований екземпляр, трохи ідея "мультитон")

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


Поведінкові моделі

Ланцюг відповідальності (розпізнається за поведінковими методами, який (опосередковано) викликає той самий метод в іншій реалізації того ж абстрактного / інтерфейсного типу в черзі)

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

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

Ітератор (розпізнається поведінковими методами, послідовно повертаючи екземпляри іншого типу з черги)

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

Мементо (впізнаваний за поведінковими методами, який внутрішньо змінює стан усього екземпляра)

Спостерігач (або Опублікувати / Підписатись) (розпізнається за поведінковими методами, який викликає метод у екземплярі іншого абстрактного / інтерфейсного типу, залежно від власного стану)

Держава (розпізнається за поведінковими методами, яка змінює свою поведінку залежно від стану екземпляра, яким можна керувати зовні)

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

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

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


23
вражаючий .. :) +1. javax.lang.model.elementвизначає відвідувачів;) Я не зовсім впевнений в тому , doXXXі doFilterв «стратегії».
Божо

16
Згадані будівельники, наприклад, StrinbgBuilder - це не приклад для Builder-Pattern. Однак дуже поширена помилка вважати їх будівельниками (тому ви насправді не винні ^ _ ^)
Angel O'Sphere

77
@BalusC, у мене є запитання. Чи читали ви цілий вихідний код Java та JSF?
Tapas Bose

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 та класів вигляд та відчуття Swing plug
  6. java.lang.Runtime#getRuntime() є Сінглтон
  7. ButtonGroup для моделі «Медіатор»
  8. Action, AbstractActionможе використовуватися для різних візуальних зображень для виконання одного і того ж коду -> Командний шаблон
  9. Інтерновані струни або CellRender в JTable для Flyweight Pattern (Також подумайте про різні пули - Нитки пулів, пули з'єднань, об'єктивні пули EJB - Flyweight справді стосується управління спільними ресурсами)
  10. Модель події Java 1.0 є прикладом ланцюжка відповідальності, як і фільтри сервлетів.
  11. Шаблон ітератора в рамках колекцій
  12. Вкладені контейнери в AWT / Swing використовують шаблон композиту
  13. Менеджери планування в AWT / Swing - приклад стратегії

і багато іншого я здогадуюсь


1
Дякуємо за пораду на MouseAdapter. Я знайшов цей exaplanation: stackoverflow.com/questions/9244185 / ...
Лінкольн

Зауважте, що Swing базується лише на MVC. Він перетворив View and Controller в один клас.
Маттіас Браун

51
  1. Легкий вага використовується з деякими значеннями Байт, Короткий, Цілий, Довгий і Строковий.
  2. Фасад використовується в багатьох місцях, але найбільш очевидним є інтерфейс сценаріїв.
  3. Синглтон - java.lang.Runime приходить на думку.
  4. Анотація заводу - також сценарій та JDBC API.
  5. Команда - Скасувати / Повторити TextComponent.
  6. Інтерпретатор - RegEx (java.util.regex. ) Та SQL (java.sql. API ).
  7. Прототип - Не на 100% впевнений, чи враховується це, але я думаю, що clone()метод може бути використаний для цієї мети.

1
Щодо схеми легкої ваги : це можуть бути різні менеджери макетів java.awtта java.swingпакети. Дійсно, вони поділяють майже однакові внутрішні атрибути, а зовнішні атрибути - це різні компоненти інтерфейсу, які вони викладають у формі інтерфейсу.
Віталій

@NawaMan Ви сказали 5. Скасувати / Повторити команду TextComponent. Я думаю, що це пам'ять не команда. Або, швидше за все, і те й інше.
Кіт Стімпсон

Чи не могли б ви мені допомогти в пов'язаний з цим питання - stackoverflow.com/questions/61284856 / ... . Я використовував шаблон команди в цьому простому прикладі, але я не впевнений, чи це правильний спосіб вирішити мою проблему.
Том Джо

42

RMI заснований на проксі.

Потрібно навести один для більшості з 23 моделей у GoF:

  1. Анотація Factory: інтерфейси java.sql отримують свої конкретні реалізації від JDBC JAR, коли драйвер зареєстрований.
  2. Builder: java.lang.StringBuilder.
  3. Фабричний метод: Фабрики XML, серед інших.
  4. Прототип: Можливо, клон (), але я не впевнений, що купую це.
  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. Легка вага: Цілий, персонаж тощо.
  12. Проксі: пакет java.rmi
  13. Ланцюг відповідальності: фільтри сервлетів
  14. Команда: Перемістіть пункти меню
  15. Перекладач: В JDK немає безпосередньо, але JavaCC, безумовно, використовує це.
  16. Ітератор: інтерфейс java.util.Iterator; не може бути зрозумілішим за це.
  17. Посередник: JMS?
  18. Повідомлення:
  19. Спостерігач: java.util.Observer/Observable (погано зроблено, хоча)
  20. Штат:
  21. Стратегія:
  22. Шаблон:
  23. Відвідувач:

Я не можу придумати приклади на Java для 10 з 23, але я побачу, чи зможу завтра краще. Саме для цього потрібна редакція.


28

Абстрактний заводський візерунок використовується в різних місцях. Наприклад, DatagramSocketImplFactory, PreferencesFactory. Є ще багато --- пошук Javadoc для інтерфейсів, у яких в назві є слово "Фабрика".

Також є досить багато примірників фабричного шаблону.


22

Незважаючи на те, що я начебто зламаний годинник з цим, API Java XML дуже багато використовує 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. Оскільки і створений фабричний надклас (Колекція), і створений Ітератор є інтерфейсами, його іноді плутають із AbstractFactory. Більшість прикладів AbstractFactory у прийнятій відповіді (BalusC) - це приклади Фабрики , спрощеної версії Фабричного методу, яка не є частиною оригінальних моделей GoF. У Facory ієрархія класу Factory зведена, і фабрика використовує інші засоби для вибору продукту, який потрібно повернути.

  • Анотація заводу

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.