Примеры шаблонов проектирования GoF в основных библиотеках Java
Gof паттерны проектирования java. Я изучаю шаблоны дизайна GoF Java и хочу увидеть некоторые примеры из них в реальной жизни. Каковы некоторые хорошие примеры этих шаблонов проектирования в основных библиотеках Java?
Вы можете найти обзор многих шаблонов проектирования в Википедии . Он также упоминает, какие шаблоны упоминаются GoF. Я суммирую их здесь и попытаюсь назначить как можно больше реализаций шаблонов, найденных в API Java и Java US.
Курс GOF ПАТТЕРНЫ JAVA ОТ ДЖЕИМСА можно скачать в конце статьи.
Творческие шаблоны
Абстрактная фабрика
- (узнаваемая методами создания, которые возвращают сам завод, который, в свою очередь, может использоваться для создания другого типа интерфейса / сводки)
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
Конструктор
-
Java.lang.StringBuilder#append()
(несинхронизированный) -
Java.lang.StringBuffer#append()
(синхронизированный) -
Java.nio.ByteBuffer#put()
(также вCharBuffer
,ShortBuffer
,IntBuffer
,LongBuffer
,FloatBuffer
andDoubleBuffer
) javax.swing.GroupLayout.Group#addComponent()
- Все реализации
Java.lang.Appendable
Java.util.stream.Stream.Builder
Заводской метод
Java.util.Calendar#getInstance()
Java.util.ResourceBundle#getBundle()
Java.text.NumberFormat#getInstance()
Java.nio.charset.Charset#forName()
-
Java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(Возвращает объект singleton по протоколу) Java.util.EnumSet#of()
-
javax.xml.bind.JAXBContext#createMarshaller()
и другие подобные методы
Прототип
-
Java.lang.Object#clone()
(класс должен реализоватьJava.lang.Cloneable
)
Singleton
Java.lang.Runtime#getRuntime()
Java.awt.Desktop#getDesktop()
Java.lang.System#getSecurityManager()
Структурные модели
Адаптер
Java.util.Arrays#asList()
Java.util.Collections#list()
Java.util.Collections#enumeration()
-
Java.io.InputStreamReader(InputStream)
(возвращаетReader
) -
Java.io.OutputStreamWriter(OutputStream)
(возвращаетWriter
) -
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
а#unmarshal()
Мост
- Никто еще не приходит на ум. Фиктивным примером может быть
new LinkedHashMap(LinkedHashSet<K>, List<V>)
то, что он возвращает не модифицируемую связанную карту, которая не клонирует элементы, но использует их . Однако методыJava.util.Collections#newSetFromMap()
иsingletonXXX()
приближаются.
Составной
-
Java.awt.Container#add(Component)
(практически все качели поэтому) -
javax.faces.component.UIComponent#getChildren()
(таким образом, практически весь пользовательский интерфейс JSF)
Декоратор
- Все подклассы
Java.io.InputStream
,OutputStream
,Reader
иWriter
имеют конструктор, который принимает экземпляр того же типа. -
Java.util.Collections
, лаcheckedXXX()
,synchronizedXXX()
иunmodifiableXXX()
methods. -
javax.servlet.http.HttpServletRequestWrapper
аHttpServletResponseWrapper
javax.swing.JScrollPane
Fachada
-
javax.faces.context.FacesContext
, внутренне использует, среди прочего, интерфейсные/абстрактные типыLifeCycle
ViewHandler
,NavigationHandler
и многое другое без необходимости беспокоиться об этом конечному пользователю (которые, однако, могут быть переопределены инъекцией). -
javax.faces.context.ExternalContext
, который использует внутреннеServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
и т.
Fly weight
-
Java.lang.Integer#valueOf(int)
(также вBoolean
,Byte
,Character
,Short
,Long
andBigDecimal
)
Прокси
Java.lang.reflect.Proxy
Java.rmi.*
javax.ejb.EJB
javax.inject.Inject
javax.persistence.PersistenceContext
Модели поведения
Цепочка ответственности
Java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
Команда
- Все реализации
Java.lang.Runnable
- Все реализации
javax.swing.Action
Интерпретируйте
Java.util.Pattern
Java.text.Normalizer
- Все подклассы
Java.text.Format
- Все подклассы
javax.el.ELResolver
Итератор
- Все реализации
Java.util.Iterator
(а также среди других тожеJava.util.Scanner
!). - Все реализации
Java.util.Enumeration
Посредник
-
Java.util.Timer
(все методыscheduleXXX()
) Java.util.concurrent.Executor#execute()
-
Java.util.concurrent.ExecutorService
(методыinvokeXXX()
иsubmit()
) -
Java.util.concurrent.ScheduledExecutorService
(все методыscheduleXXX()
) Java.lang.reflect.Method#invoke()
Memento
-
Java.util.Date
(методы установки делают это,Date
он внутренне представленlong
значением) - Все реализации
Java.io.Serializable
- Все реализации
javax.faces.component.StateHolder
Наблюдатель (или публикация/подписка)
-
Java.util.Observer
/Java.util.Observable
(хотя он редко используется в реальном мире) - Все реализации
Java.util.EventListener
(практически все качели, следовательно) javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
Состояние
-
javax.faces.lifecycle.LifeCycle#execute()
(контролируетсяFacesServlet
, поведение зависит от текущей фазы (состояния) жизненного цикла JSF)
Стратегия
-
Java.util.Comparator#compare()
, казненный среди прочихCollections#sort()
. -
javax.servlet.http.HttpServlet
,service()
и все методыdoXXX()
берутHttpServletRequest
иHttpServletResponse
и разработчик должен обрабатывать их (а не получать их в качестве примеров переменных!). javax.servlet.Filter#doFilter()
Метод шаблона
- Все не абстрактные методы
Java.io.InputStream
,Java.io.OutputStream
,Java.io.Reader
иJava.io.Writer
. - Все не абстрактные методы
Java.util.AbstractList
,Java.util.AbstractSet
И.Java.util.AbstractMap
-
javax.servlet.http.HttpServlet
, все методыdoXXX()
по умолчанию отправляют ошибку HTTP 405 «метод не разрешен» в ответ. Вы можете реализовать любой или любой из них.
Посетитель
-
javax.lang.model.element.AnnotationValue
аAnnotationValueVisitor
-
javax.lang.model.element.Element
аElementVisitor
-
javax.lang.model.type.TypeMirror
аTypeVisitor
-
Java.nio.file.FileVisitor
аSimpleFileVisitor
-
javax.faces.component.visit.VisitContext
аVisitCallback
- Шаблон наблюдателя по всему качанию (
Observable
,Observer
) - MVC также в swing
- Шаблон адаптера: InputStreamReader и OutputStreamWriter Примечание:
ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
are not adapters; на самом деле они являются нулевыми объектами. Плохой выбор имен Sun. - Шаблон декоратора (
BufferedInputStream
может украсить другие потоки, такие какFilterInputStream
) - AbstractFactory шаблон для AWT Toolkit и интерактивных классов внешнего вида Swing
-
Java.lang.Runtime#getRuntime()
это синглтон. -
ButtonGroup
для паттерна посредника -
Action
,AbstractAction
может использоваться для разных визуальных представлений для выполнения одного и того же кода — > шаблон команды - Внутренние строки или CellRender в JTable для Flyweight Pattern (также подумайте о различных пулах-пулы потоков, пулы соединений, пулы объектов EJB-Flyweight действительно об управлении общими ресурсами)
- Модель событий Java 1.0 является примером цепочки ответственности, как и фильтры сервлетов.
- Шаблон итератора в кадре коллекций
- Вложенные контейнеры в AWT/Swing используют составной шаблон
- Менеджеры дизайна в AWT/Swing являются примером стратегии
и многое другое, я думаю.
- Fly weight используется с некоторыми значениями Byte, Short, Integer, Long и String.
- Фасад используется во многих местах, но наиболее очевидным является интерфейсы сценариев.
- Полуфалло — Ява.Лэнг.Runtime приходит на ум.
- Абстрактная фабрика — также сценарии и JDBC API.
- Команда — отменить / повторить TextComponent.
- Interprete — RegEx (Java.полезный.regex.) и SQL (Java.sql. ) АПИ.
-
Прототип — я не уверен на 100%, имеет ли это значение, но я думаю, что метод
clone()
можно использовать для этой цели.
RMI основан на прокси.
Должно быть возможно процитировать один для большинства из 23 шаблонов в GoF:
- Абстрактная фабрика: все интерфейсы Java.sql получают свои конкретные реализации JDBC JAR при регистрации драйвера.
- Конструктор: Java.Лэнг.StringBuilder.
- Фабричный метод: фабрики XML, среди других.
- Прототип: может быть, clone (), но я не уверен, что вы покупаете это.
- Singleton: Java.Лэнг.System
- Адаптер: классы адаптера в Java.awt.event, например, WindowAdapter.
- Мост: классы коллекции в Java.полезный. Список, реализованный ArrayList.
- Состав: Java.awt. Ява.awt.Component + Java.awt.Container
- Декоратор: Все о упаковке Java.io.
- Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, области сеанса и подобных операций.
- Вес мухи: весь, характер и т. д.
- Прокси: пакет Java.rmi
- Цепочка ответственности: фильтры сервлетов.
- Команда: Swing пункты меню
- Интерпретатор: не непосредственно в JDK, но JavaCC, безусловно, использует это.
- Iterator: Java.полезный.Iterator interface; не может быть яснее, чем это.
- Посредник: JMS?
- Воспоминание:
- Observer: Java.полезный.Observer / Observable(хотя и плохо сделано)
- Государство:
- Стратегия:
- Модель:
- Посетитель:
Я не могу придумать примеры в Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Для этого и нужно редактирование.
Шаблон Abstract Factory используется в нескольких местах. Например,DatagramSocketImplFactory
,PreferencesFactory
. Есть еще много — посмотрите на Javadoc для интерфейсов, которые имеют слово «Factory» в их названии.
Есть также довольно много экземпляров Заводского шаблона.
Несмотря на то, что у меня есть какие-то сломанные часы с этим, Java XML API использует много Factory. Я имею в виду посмотреть на это:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
…и так далее, и так далее.
- Заводской метод
Ява.полезный.Collection # Iterator является хорошим примером фабричного метода. В зависимости от конкретного подкласса используемой коллекции вы создадите реализацию итератора.
Поскольку как заводской суперкласс (коллекция), так и созданный итератор являются интерфейсами, его иногда путают с AbstractFactory. Большинство примеров AbstractFactory в принятом ответе (BalusC) являются примерами Factory, упрощенная версия Factory Method, которая не является частью оригинальных шаблонов GoF. В Facory иерархия заводских классов свернута, и фабрика использует другие средства для выбора возвращаемого продукта.
- Абстрактная фабрика
Абстрактная фабрика имеет несколько фабричных методов, каждый из которых создает другой продукт. Продукты, произведенные фабрикой, предназначены для использования вместе (лучше, чтобы ваш принтер и картриджи были с одного завода (резюме)). Как упоминалось в предыдущих ответах, семействами компонентов AWT GUI, которые отличаются от платформы к платформе, являются примером этого (хотя их реализация отличается от структуры, описанной в Gof).
Gang of Four
В 1994 году ныне известные как группа четырех (GoF) объединились, чтобы опубликовать книгу «Design Patterns: Elements of Reusable Object Oriented Software», en он описывает простые и элегантные решения специфических проблем дизайна объектно-ориентированный. Она была написана Эрих гамма, Ричард Хельм, Ральф Джонсон и John Vlissides
Эрих гамма возглавил разработка платформы Eclipse и была создатель вместе с Кентом Беком из среды тестирования JUnit. Эрих имеет докторская степень в области компьютерных наук из Цюрихского университета. В настоящее время он работает в Microsoft в команде Visual Studio.
Ричард Хелм был консультантом технологии в DMR. Там он активно применял ориентированные шаблоны проектирования к коммерческим системам. Ранее я работал в отделе Технология IBM. Он имеет многочисленные международные публикации и пишет регулярно в дневнике доктора Добба.
Кроме того, он был членом комитета OOPSLA (конференция по объектно-ориентированному программированию). Ричард имеет докторскую степень в области компьютерных наук из Лос-Анджелеса Мельбурнский университет. В настоящее время он снова работает в IBM.
Ральф Джонсон изучал объектно-ориентированное программирование и то, как оно развивалось во время последние 10 лет. Он участвовал в разработке системы объектно-ориентированный операционный и компилятор типа Smalltalk. Ralph он имеет докторскую степень в Корнельском университете.
Он участвовал в качестве председатель нескольких изданий конференции OOPSLA. В настоящее время он работа на факультете компьютерных наук Университета из Иллинойса разрабатывает структуру для бухгалтерского учета.
Джон Влиссидес скончался 24 ноября 2005 года. Он был исследователем в IBM T. J. центр Расследование Уотсона. Их исследования включают фреймворк, инструменты и методы объектно-ориентированного проектирования. Ранее Джон был в отделе из компьютерных систем Стэнфордского университета. У Джона есть докторская степень в области электротехники в Стэнфордском университете.
Ссылки
Шаблоны здесь выставлены они основаны на книге ”шаблоны дизайна» Gof паттерны проектирования java, которую они написали GoF и которая до сих пор остается одной из основные ссылки на разработку программного обеспечения и шаблоны дизайн.
Каталог шаблоны проектирования java
Шаблоны различаются по своему уровень абстракции и поскольку существует множество шаблонов проектирования необходимо организовать их по семьям.
Цель отражает, что он делает шаблон и может быть:
- Создание: они связаны с процессом создание или создание экземпляра объекта.
- Структурные: они связаны с состав классов и объектов.
- Поведение: они связаны с режимом в что классы и объекты взаимодействуют и как распределяются ответственности.
Область определяет, к кому применяется шаблон, и может быть:
- Классы: Они имеют дело с отношениями между классами и подклассами. Отношение между классами устанавливаются через наследование, так что они статические отношения, установленные во время компиляции.
- Объекты: Они имеют дело с отношениями между объектами, которые являются динамическими отношениями и они могут меняться во время выполнения.
В следующей таблице мы можем увидеть шаблоны организованы по двум критериям “цель” и “сфера”.
Цель | ||||
---|---|---|---|---|
Создание | Структура | Поведение | ||
Область | Класс | Factory Method | Adapter (классы) | Interpreter Template Method |
Объект | Abstract Factory Builder Prototype Singleton |
Adapter (objetos) Bridge Composite Decorator Facade Flyweight Proxy |
Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor |
Цель создания:
Factory Method (способ изготовления)
Определяет интерфейс для создайте объект, но пусть подклассы решат, какой класс будет создан. Позволяет классу делегировать своим подклассам создание объектов
Abstract Factory (Абстрактная Фабрика)
Обеспечивает интерфейс создание семейств связанных или зависящих друг от друга объектов без необходимо указать свои конкретные классы.
Builder (Строитель)
Отделяет конструкцию от полный объект его представления. Таким образом, тот же процесс строительство может создавать различные представления.
Prototype (Прототип)
Указывает типы объекты для создания с помощью прототипа экземпляра и создания новых объектов создание копий прототипа объекта.
Синглтон (Единственный)
Гарантирует, что существует только экземпляр класса и предоставляет глобальную точку доступа к этому инстанция.
Цель структуры:
Adapter (Адаптер)
Преобразует интерфейс один класс в другом, который ожидает клиентов. Позволяет интегрировать классы с несовместимыми интерфейсами.
Bridge CC (Мост)
Отделяет абстракцию их реализации, так что оба могут различаться по форме независимо.
Композитный материал (Составной)
Объединение объектов в древовидные структуры для представления иерархий. Позволяет клиентам относитесь одинаково к отдельным объектам соединений.
Decorator (Декоратор)
Добавить новые обязанности к объекту, обеспечивает гибкую альтернативу наследование для расширения функциональности.
Facade (Фасад)
Обеспечивает интерфейс унифицирован для набора интерфейсов. Определяет интерфейс высокого уровня, который это делает подсистему более удобной для пользователя.
Flyweight (легковес)
Используйте поведение для разрешить большое количество мелких объектов эффективно.
Прокси (Доверенное лицо)
Обеспечивает замену или представитель другого объекта для контроля доступа к нему.
Цель поведение:
Interpreter (Переводчик)
Учитывая язык, он определяет представление своей грамматики вместе с интерпретатор, который использует это представление для анализа операторов язык.
Template Method (Метод шаблона)
Определяет в операции скелет алгоритма, делегируя подклассы несколько шагов. То есть он позволяет подклассам переопределять определенные шаги алгоритма без изменения структуры.
Chain of Responsibility (цепочка ответственности)
Отсоединяет отправитель от запроса получателя. Создает строку принимающие объекты, которые имеют возможность ответить на запрос и петиция проходит по цепочке, пока один из получателей не лечит ее.
Command (Команда)
Инкапсулирует запрос в объект, позволяя параметризовать клиенты с различными запросами.
Iterator (Итератор)
Обеспечивает режим последовательного доступа к элементам добавленный объект, не раскрывая его внутреннее представление.
Mediator (Посредник)
Определяет объект, который инкапсулирует, как взаимодействует набор объекты. Получает под соединением предотвращая объекты от ссылаться одни другим явно.
Memento (Воспоминание)
Представляет и аутсорсинг внутреннего состояния объекта, не нарушая инкапсуляция, так что он может вернуться в свое состояние позже.
Observer (Наблюдатель)
Определяет зависимость от одного ко многим между объектами, так что при изменении состояния объекта уведомляются все зависящие от него объекты от него.
Strategy (Стратегия)
Определяет семейство алгоритмов, инкапсулирует каждый из них и делает его взаимозаменяемым. Позволяет алгоритму изменяться независимо от клиент, который использует его.
Visitor (Посетитель)
Представляет операцию над элементами структуры объекты. Позволяет определить новую операцию без изменения классов элементы, на которых он работает.
Еще одна интересная возможность чтобы классифицировать шаблоны, необходимо сгруппировать их в зависимости от того, как несколько шаблонов они ссылаются на других.
Скачать курс Gof паттерны Java
Скачать курс в 10 раз дешевле, чем на продажнике. Ссылка ниже, о курсе:
https://www.udemy.com/course/java-patterns/
После оплаты, Вас автоматом перекинет на облако, для скачки.
Gof паттерны проектирования java. Важно иметь различные точки зрения, думая о шаблонах проектирования, таким образом мы сможем лучше понять, что они делают, сравнить их друг с другом и выбрать, какой из них он более эффективно решает конкретную проблему, которую мы хотим решить.