8a38c982
Содержание скрыть
3 Структурные модели
4 Модели поведения

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

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 and DoubleBuffer )
  • 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() и другие подобные методы

Прототип 

(узнаваемый методами создания, которые возвращают different экземпляр себя с теми же свойствами)

  • Java.lang.Object#clone() (класс должен реализовать Java.lang.Cloneable )

Singleton 

(узнаваемый методами создания, которые возвращают экземпляр same (обычно самого себя) каждый раз)

  • Java.lang.Runtime#getRuntime()
  • Java.awt.Desktop#getDesktop()
  • Java.lang.System#getSecurityManager()

Структурные модели

Адаптер 

(узнаваемый методами создания, которые принимают экземпляр different abstract / типа интерфейса и возвращают реализацию самого / другого типа интерфейса / abstract, который украшает / переопределяет данный экземпляр)

  • 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()

Мост 

(узнаваемый методами создания, которые принимают экземпляр different abstract / типа интерфейса и возвращают реализацию самого абстрактного / типа интерфейса, который delegates / использует данный экземпляр)

  • Никто еще не приходит на ум. Фиктивным примером может быть new LinkedHashMap(LinkedHashSet<K>, List<V>)то, что он возвращает не модифицируемую связанную карту, которая не клонирует элементы, но использует их . Однако методы Java.util.Collections#newSetFromMap()и singletonXXX()приближаются.

Составной 

(узнаваемый поведенческими методами, которые принимают экземпляр same abstract / типа интерфейса в древовидной структуре)

  • Java.awt.Container#add(Component) (практически все качели поэтому)
  • javax.faces.component.UIComponent#getChildren() (таким образом, практически весь пользовательский интерфейс JSF)

Декоратор 

(узнаваемый методами создания, которые принимают экземпляр same абстрактного типа / интерфейса, который добавляет дополнительное поведение)

  • Все подклассы Java.io.InputStream,OutputStream, Readerи Writerимеют конструктор, который принимает экземпляр того же типа.
  • Java.util.Collections , лаcheckedXXX(), synchronizedXXX()и unmodifiableXXX()methods.
  • javax.servlet.http.HttpServletRequestWrapper а HttpServletResponseWrapper
  • javax.swing.JScrollPane

Fachada

узнаваемый поведенческими методами, которые внутренне используют экземпляры different независимых типов интерфейса / сводки)

  • javax.faces.context.FacesContext , внутренне использует, среди прочего, интерфейсные/абстрактные типыLifeCycleViewHandler, NavigationHandlerи многое другое без необходимости беспокоиться об этом конечному пользователю (которые, однако, могут быть переопределены инъекцией).
  • javax.faces.context.ExternalContext , который использует внутреннеServletContext,HttpSession,HttpServletRequest, HttpServletResponseи т.

Fly weight 

(узнаваемый методами создания, которые возвращают кэшированный экземпляр, немного идея » multiton»)

  • Java.lang.Integer#valueOf(int) (также в Boolean , Byte , Character , Short , Long and BigDecimal )

Прокси 

(узнаваемый методами создания, который возвращает реализацию данного типа интерфейса/интерфейса, который, в свою очередь, delegates / использует different реализацию данного типа интерфейса / резюме)

  • Java.lang.reflect.Proxy
  • Java.rmi.*
  • javax.ejb.EJB
  • javax.inject.Inject
  • javax.persistence.PersistenceContext

Модели поведения

Цепочка ответственности 

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

  • Java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()

Команда 

(узнаваемая поведенческими методами в абстрактном типе / интерфейсе, который вызывает метод в реализации абстрактного типа / different интерфейса, который был инкапсулирован реализацией команды во время ее создания)

  • Все реализации 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 

(узнаваемый поведенческими методами, которые внутренне изменяют состояние экземпляра whole)

  • 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 «метод не разрешен» в ответ. Вы можете реализовать любой или любой из них.

Посетитель 

(узнаваемый двумя different abstract / типами интерфейса, которые имеют определенные методы, которые принимают каждый other abstract / тип интерфейса; один из них вызывает метод другого,а другой выполняет желаемую стратегию на нем)

  • 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
  1. Шаблон наблюдателя по всему качанию (Observable,Observer)
  2. MVC также в swing
  3. Шаблон адаптера: InputStreamReader и OutputStreamWriter Примечание:ContainerAdapter,ComponentAdapter,FocusAdapter,KeyAdapter, MouseAdapterare not adapters; на самом деле они являются нулевыми объектами. Плохой выбор имен Sun.
  4. Шаблон декоратора (BufferedInputStreamможет украсить другие потоки, такие какFilterInputStream)
  5. AbstractFactory шаблон для AWT Toolkit и интерактивных классов внешнего вида Swing
  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. Fly weight используется с некоторыми значениями Byte, Short, Integer, Long и String.
  2. Фасад используется во многих местах, но наиболее очевидным является интерфейсы сценариев.
  3. Полуфалло — Ява.Лэнг.Runtime приходит на ум.
  4. Абстрактная фабрика — также сценарии и JDBC API.
  5. Команда — отменить / повторить TextComponent.
  6. Interprete — RegEx (Java.полезный.regex.) и SQL (Java.sql. ) АПИ.
  7. Прототип — я не уверен на 100%, имеет ли это значение, но я думаю, что метод clone()можно использовать для этой цели.

Курсы Python 3

RMI основан на прокси.

Должно быть возможно процитировать один для большинства из 23 шаблонов в GoF:

  1. Абстрактная фабрика: все интерфейсы Java.sql получают свои конкретные реализации JDBC JAR при регистрации драйвера.
  2. Конструктор: Java.Лэнг.StringBuilder.
  3. Фабричный метод: фабрики XML, среди других.
  4. Прототип: может быть, clone (), но я не уверен, что вы покупаете это.
  5. Singleton: Java.Лэнг.System
  6. Адаптер: классы адаптера в Java.awt.event, например, WindowAdapter.
  7. Мост: классы коллекции в Java.полезный. Список, реализованный ArrayList.
  8. Состав: Java.awt. Ява.awt.Component + Java.awt.Container
  9. Декоратор: Все о упаковке Java.io.
  10. Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, области сеанса и подобных операций.
  11. Вес мухи: весь, характер и т. д.
  12. Прокси: пакет Java.rmi
  13. Цепочка ответственности: фильтры сервлетов.
  14. Команда: Swing пункты меню
  15. Интерпретатор: не непосредственно в JDK, но JavaCC, безусловно, использует это.
  16. Iterator: Java.полезный.Iterator interface; не может быть яснее, чем это.
  17. Посредник: JMS?
  18. Воспоминание:
  19. Observer: Java.полезный.Observer / Observable(хотя и плохо сделано)
  20. Государство:
  21. Стратегия:
  22. Модель:
  23. Посетитель:

Я не могу придумать примеры в 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

курсы Паттерны в объектно-ориентированном программировании

паттерны разработки java

В 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

Шаблоны различаются по своему уровень абстракции и поскольку существует множество шаблонов проектирования необходимо организовать их по семьям.

Цель отражает, что он делает шаблон и может быть:

  1. Создание: они связаны с процессом создание или создание экземпляра объекта.
  2. Структурные: они связаны с состав классов и объектов.
  3. Поведение: они связаны с режимом в что классы и объекты взаимодействуют и как распределяются ответственности.

Область определяет, к кому применяется шаблон, и может быть:

  1. Классы: Они имеют дело с отношениями между классами и подклассами. Отношение между классами устанавливаются через наследование, так что они статические отношения, установленные во время компиляции.
  2. Объекты: Они имеют дело с отношениями между объектами, которые являются динамическими отношениями и они могут меняться во время выполнения.

В следующей таблице мы можем увидеть шаблоны организованы по двум критериям “цель” и “сфера”.

курсы Отчеты и автоматизация на Python PDF, HTML, email

Цель
Создание Структура Поведение
Область Класс 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. Важно иметь различные точки зрения, думая о шаблонах проектирования, таким образом мы сможем лучше понять, что они делают, сравнить их друг с другом и выбрать, какой из них он более эффективно решает конкретную проблему, которую мы хотим решить.


Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии