Примеры паттернов проектирования GoF в ядре библиотек Java
Проблема: Поиск реальных примеров паттернов проектирования GoF в Java
Я изучаю паттерны проектирования "Банды четырех" (GoF) на Java и хотел бы увидеть реальные примеры их использования. Есть ли хорошие примеры применения этих паттернов в основных библиотеках Java? Буду благодарен за любые ссылки или объяснения, которые помогут мне лучше понять, как эти паттерны реализуются на практике.
4 ответ(ов)
Вот ответы на ваш вопрос о паттернах проектирования в Java Swing и других компонентах:
Паттерн Наблюдатель (Observer): В Swing реализован через интерфейсы
Observable
иObserver
. Это позволяет объектам (наблюдателям) подписываться на изменения другого объекта (наблюдаемого).MVC (Model-View-Controller): В Swing также реализован паттерн MVC, который структурирует приложение, разделяя данные (Model), интерфейс (View) и логику (Controller).
Паттерн Адаптер (Adapter): Примером адаптера служат классы
InputStreamReader
иOutputStreamWriter
. Обратите внимание, что такие классы, какContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
, на самом деле не являются адаптерами, а представляют собой объекты Null. Это плохое название, данное Sun.Паттерн Декоратор (Decorator): Например,
BufferedInputStream
может декорировать другие потоки, такие какFilterInputStream
, добавляя новую функциональность.Паттерн Абстрактная Фабрика (Abstract Factory): В AWT и Swing используются абстрактные фабрики для создания классов с возможностью настроки интерфейса (pluggable look-and-feel).
Singleton: Метод
java.lang.Runtime#getRuntime()
реализует паттерн Singleton, обеспечивая единственный экземпляр этого класса.Паттерн Посредник (Mediator): Класс
ButtonGroup
используется для реализации медиатором, позволяя управлять состоянием группы кнопок.Паттерн Команда (Command): Классы
Action
иAbstractAction
могут быть использованы для разных визуальных представлений, выполняющих одни и те же действия.Паттерн Летучий объект (Flyweight): Использование интернированных строк или рендереров ячеек в
JTable
иллюстрирует паттерн Flyweight. Также можно учитывать различные пулы - пулы потоков, пулы соединений и пулы объектов EJB, которые связаны с управлением общими ресурсами.Цепочка Обязанностей (Chain of Responsibility): Модель событий Java 1.0 является примером паттерна Цепочка Обязанностей, как и фильтры сервлетов.
Итератор (Iterator): Паттерн Итератор используется в Collections Framework для перебора элементов коллекции.
Компоновщик (Composite): Вложенные контейнеры в AWT/Swing используют паттерн Компоновщик для группировки объектов.
Стратегия (Strategy): Менеджеры компоновки (Layout Managers) в AWT/Swing служат примером паттерна Стратегия, позволяя изменять способ размещения компонентов.
И это только некоторые из паттернов, которые можно найти в Java. Java - это мощная экосистема, и многие другие паттерны также могут быть идентифицированы в разных компонентах.
Вот перевод ваших пунктов на русский в стиле ответа на StackOverflow:
Flyweight используется с некоторыми значениями типов Byte, Short, Integer, Long и String. Это позволяет оптимизировать память, разделяя общие экземпляры объектов.
Facade применяется во многих местах, но наиболее очевидным примером являются интерфейсы сценариев (Scripting interfaces). Он упрощает взаимодействие с более сложными системами.
Singleton — на ум приходит java.lang.Runtime, который гарантирует наличие единственного экземпляра во всей программе.
Abstract Factory — также используется в сценариях (Scripting) и API JDBC, предоставляя способ создания объектов без указания конкретных классов.
Command — примером может служить функция Undo/Redo в TextComponent, где команды инкапсулируются и могут быть выполнены позже.
Interpreter — это паттерн, который можно увидеть в регулярных выражениях (java.util.regex.) и API SQL (java.sql.), где он помогает в интерпретации и выполнении выражений.
Prototype — не уверен на 100%, но мне кажется, что метод
clone()
может использоваться для реализации этого паттерна, позволяя создавать новые экземпляры объектов на основе уже существующих.
Шаблон "Абстрактная фабрика" (Abstract Factory) применяется в различных местах. Например, в DatagramSocketImplFactory
, PreferencesFactory
. Существует множество других примеров — просто поищите в Javadoc интерфейсы, в имени которых присутствует слово "Factory".
Кроме того, есть довольно много случаев использования паттерна "Фабрика" (Factory) тоже.
Да, вы правы. В 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). Это еще один распространенный шаблон проектирования, который упрощает создание сложных объектов пошагово.
Использование таких паттернов помогает сделать код более чистым и модульным, облегчая его расширение и тестирование.
Почему стоит использовать геттеры и сеттеры?
Можно ли создать экземпляр абстрактного класса?
Eclipse/Java: не работает автозавершение кода
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки