6

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

1

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

Я изучаю паттерны проектирования "Банды четырех" (GoF) на Java и хотел бы увидеть реальные примеры их использования. Есть ли хорошие примеры применения этих паттернов в основных библиотеках Java? Буду благодарен за любые ссылки или объяснения, которые помогут мне лучше понять, как эти паттерны реализуются на практике.

4 ответ(ов)

1

Вот ответы на ваш вопрос о паттернах проектирования в Java Swing и других компонентах:

  1. Паттерн Наблюдатель (Observer): В Swing реализован через интерфейсы Observable и Observer. Это позволяет объектам (наблюдателям) подписываться на изменения другого объекта (наблюдаемого).

  2. MVC (Model-View-Controller): В Swing также реализован паттерн MVC, который структурирует приложение, разделяя данные (Model), интерфейс (View) и логику (Controller).

  3. Паттерн Адаптер (Adapter): Примером адаптера служат классы InputStreamReader и OutputStreamWriter. Обратите внимание, что такие классы, как ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter, на самом деле не являются адаптерами, а представляют собой объекты Null. Это плохое название, данное Sun.

  4. Паттерн Декоратор (Decorator): Например, BufferedInputStream может декорировать другие потоки, такие как FilterInputStream, добавляя новую функциональность.

  5. Паттерн Абстрактная Фабрика (Abstract Factory): В AWT и Swing используются абстрактные фабрики для создания классов с возможностью настроки интерфейса (pluggable look-and-feel).

  6. Singleton: Метод java.lang.Runtime#getRuntime() реализует паттерн Singleton, обеспечивая единственный экземпляр этого класса.

  7. Паттерн Посредник (Mediator): Класс ButtonGroup используется для реализации медиатором, позволяя управлять состоянием группы кнопок.

  8. Паттерн Команда (Command): Классы Action и AbstractAction могут быть использованы для разных визуальных представлений, выполняющих одни и те же действия.

  9. Паттерн Летучий объект (Flyweight): Использование интернированных строк или рендереров ячеек в JTable иллюстрирует паттерн Flyweight. Также можно учитывать различные пулы - пулы потоков, пулы соединений и пулы объектов EJB, которые связаны с управлением общими ресурсами.

  10. Цепочка Обязанностей (Chain of Responsibility): Модель событий Java 1.0 является примером паттерна Цепочка Обязанностей, как и фильтры сервлетов.

  11. Итератор (Iterator): Паттерн Итератор используется в Collections Framework для перебора элементов коллекции.

  12. Компоновщик (Composite): Вложенные контейнеры в AWT/Swing используют паттерн Компоновщик для группировки объектов.

  13. Стратегия (Strategy): Менеджеры компоновки (Layout Managers) в AWT/Swing служат примером паттерна Стратегия, позволяя изменять способ размещения компонентов.

И это только некоторые из паттернов, которые можно найти в Java. Java - это мощная экосистема, и многие другие паттерны также могут быть идентифицированы в разных компонентах.

0

Вот перевод ваших пунктов на русский в стиле ответа на StackOverflow:

  1. Flyweight используется с некоторыми значениями типов Byte, Short, Integer, Long и String. Это позволяет оптимизировать память, разделяя общие экземпляры объектов.

  2. Facade применяется во многих местах, но наиболее очевидным примером являются интерфейсы сценариев (Scripting interfaces). Он упрощает взаимодействие с более сложными системами.

  3. Singleton — на ум приходит java.lang.Runtime, который гарантирует наличие единственного экземпляра во всей программе.

  4. Abstract Factory — также используется в сценариях (Scripting) и API JDBC, предоставляя способ создания объектов без указания конкретных классов.

  5. Command — примером может служить функция Undo/Redo в TextComponent, где команды инкапсулируются и могут быть выполнены позже.

  6. Interpreter — это паттерн, который можно увидеть в регулярных выражениях (java.util.regex.) и API SQL (java.sql.), где он помогает в интерпретации и выполнении выражений.

  7. Prototype — не уверен на 100%, но мне кажется, что метод clone() может использоваться для реализации этого паттерна, позволяя создавать новые экземпляры объектов на основе уже существующих.

0

Шаблон "Абстрактная фабрика" (Abstract Factory) применяется в различных местах. Например, в DatagramSocketImplFactory, PreferencesFactory. Существует множество других примеров — просто поищите в Javadoc интерфейсы, в имени которых присутствует слово "Factory".

Кроме того, есть довольно много случаев использования паттерна "Фабрика" (Factory) тоже.

0

Да, вы правы. В Java действительно часто используется паттерн проектирования "Фабрика" (Factory Pattern), особенно в XML API. Как вы уже заметили, код выглядит следующим образом:

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

Здесь мы видим, что интерфейсы DocumentBuilderFactory и XPathFactory предоставляют статические методы newInstance(), которые возвращают экземпляры фабрик для создания объектов DocumentBuilder и XPath соответственно. Это позволяет удобно управлять созданием необходимых объектов, не привязываясь к их конкретным реализациям.

Кроме того, как вы упомянули, существует и ряд классов, таких как StringBuffer, ByteBuffer и StringBuilder, которые используют концепцию "Строитель" (Builder). Это еще один распространенный шаблон проектирования, который упрощает создание сложных объектов пошагово.

Использование таких паттернов помогает сделать код более чистым и модульным, облегчая его расширение и тестирование.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь