Примеры паттернов проектирования 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). Это еще один распространенный шаблон проектирования, который упрощает создание сложных объектов пошагово.
Использование таких паттернов помогает сделать код более чистым и модульным, облегчая его расширение и тестирование.
Почему стоит использовать геттеры и сеттеры?
Можно ли создать экземпляр абстрактного класса?
Как эффективно реализовать шаблон одиночки в Java? [закрыто]
Как мне следовало объяснить разницу между интерфейсом и абстрактным классом? [закрыто]
Фабрика в Java: как создавать конкретные объекты с различными параметрами конструктора