Шаблоны проектирования (Design Patterns) в библиотеках Java SE/EE

max аватар
87
Находится в разделах:

 

В интернете существует множество материалов, посвященных шаблонам проектирования (GoF patterns). 

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

Немного погуглив, нашел примеры шаблонов, которые использовались при разработке классов библиотек Java SE/EE.

И так, поехали. 

 

Creational Patterns:

Abstract factory ( распознается по создающим методам, возвращающим абстрактный/интерфейсный тип)

  • java.util.Calendar#getInstance()
  • java.util.Arrays#asList()
  • java.util.ResourceBundle#getBundle()
  • java.net.URL#openConnection()
  • java.sql.DriverManager#getConnection()
  • java.sql.Connection#createStatement()
  • java.sql.Statement#executeQuery()
  • java.text.NumberFormat#getInstance()
  • java.lang.management.ManagementFactory( все getXXX() методы)
  • java.nio.charset.Charset#forName()
  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()
Builder ( распознается по создающим методам, возвращающим сам объект:
  • java.lang.StringBuilder#append() 
  • java.lang.StringBufer#append()
  • java.nio.ByteBuffer#put() (также CharBuffer, ShortBuffer, IntBufer, LongBufer, FloatBuffer и DoubleBuffer)
  • javax.swing.GroupLayout.Group#addComponent()
  • Все реализации java.lang.Appendable
Factory Method (определяется по создающим методам, возвращающим конкретный тип)
  • java.lang.Object#toString 
  • java.lang.Class#newInstance()
  • java.lang.Integer#valueof(String) также над Boolean, Byte, Character, Short, Long.
  • java.lang.Class#forName()
  • java.lang.reflect.Array#newInstance()
  • java.lang.reflect.Constructor#newInstance()
Prototype (распознается по создающим методам, возвращающим различный объекты самого себя с одинаковыми свойствами)
  • java.lang.Object#clone() (класс должен реализовать интерфейс java.lang.Cloneable)
Singleton (распознается по создающим методам, возвращающим всегда объект самого себя:
  • java.lang.Runtime#getRuntime()
  • java.awt.Desktop#getDesktop()
Structural patterns

Adapter (распознаются по создающим методам, принимающими объект различных абстрактных или интерфейсных типов, возвращающих реализацию другого абстрактного или интерфейсного типа, который декорирует или переопределяет принятый объект)
  • java.io.InputStreamReader (InputStream) возвращает Reader
  • java.io.OutputStreamWriter(OutputStream) возвращает Writer
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal() и #unmarshal()
Composite (распознается по поведенческим методам, принимающим объекты абстрактного или интерфейсного  типа)
  • java.util.Map#putAll(Map)
  • java.util.List#addAll(Collection)
  • java.util.Set#addAll(Collection)
  • java.nio.ByteBuffer#put(ByteBuffer) (также над CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer)
  • java.awt.Container#add(Component)
Decorator ( распознается по создающим методам, принимающим объект абстрактного или интерфейсного типа)
  • Все подклассы java.io.InputStream, OutputStream, Reader и Writer имеют конструктор, принимающий объект данного типа. 
  • Почти все реализации java.util.List, Set, Map имеют конструктор, принимающий объект данного типа. 
  • java.util.Collection, checkedXXX(), synchronizedXXX(), unmodifiableXXX().
  • javax.servlet.http.HttpServletRequestWrapper и HttpServletResponseWrapper
Facade (распознается по поведенческим методам, которые внутри себя используют объекты различных независимых абстрактных или интерфейсных типов)
  • javax.faces.webapp.FacesServlet, внутренне использует в каждому из типов ServletContext, LifeCycle, ViewHandler, NavigationHandler и многими другими без необходимости сообщать пользователю об этом. 
Flyweight (распознается по создающим методам, возвращающим кешированые объекты)
  • java.lang.Integer#valueOf(int) (также Boolean, Byte, Character, Short, Long, Float и Double)
Proxy (распознается по создающим методам, которые возвращают реализацию данного абстрактного и интерфейсного типа, который делегирует или использует другую реализацию данного абстрактного или интерфейсного типа.
  • java.lang.reflect.Proxy
  • java.rmi.*
Behavioral patterns

Chain of Responsibility (распознается по поведенческим методам, которые (неявно) вызывают аналогичный метод в другой реализации аналогичного типа в очереди)
  • java.util.logging.Logger#log()
  • javax.servlet.Filter#doFilter()
Command (распознается по поведенческим методам в абстрактном или интерфейсном типе, который вызывает метод в реализации другого абстрактного или интерфейсного типа, который был инкапсулирован реализацией command во время его создания)
  • Все реализации java.lang.Runnable
  • Все реализации javax.swing.Action
Interpreter (распознается по поведенческим методам, возвращающим структурно отличный от исходного тип данных. 
  • java.util.Pattern
  • java.text.Normalizer
  • Все подклассы java.text.Format
  • Все подклассы javax.el.ELResolver
Iterator (распознается по поведенческим методам, последовательно возвращающим различный тип из очереди)
  • Все реализации java.util.Iterator
  • Все реализации java.util.Enumeration
Mediator (распознается по поведенческим методам, которые принимают объекты различных абстрактных или интерфейсных типов данных (обычно с использованием шаблона command), а затем используют или делегируют текущий объект.
  • java.util.Timer
  • java.util.concurrent.Executor#execute()
  • java.util.concurrent.ExecutorService
  • java.util.concurrent.ScheduledExecutorService
  • java.lang.reflect.Method#invoke()
Memento (распознается по поведенческим методам, которые внутри используют изменения состояния целого объекта)
  • java.util.Date
  • Все реализации java.io.Serializable
  • Все реализации javax.faces.component.StateHolder
Obsrever (Publish/Subscribe) (распознается по поведенческим методам, которые вызывают метод объекта другого абстрактного или интерфейсного типа, в зависимости от своего собственного состояния)
  • java.util.Observer/java.util.Observable
  • Все реализации java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.faces.event.PhaseListener
State (распознается по поведенческим методам, которые изменяют его поведение в зависимости от состояния объекта, который можно контролировать снаружи)
  • Все реализации java.util.Iterator
  • javax.faces.lifecycle.LifeCycle#execute()
Strategy (распознается по поведенческим методам в абстрактном или интерфейсном типе, который вызывает метод в реализации другого абстрактного или интерфейсного типа, который был передан в метод через аргумент в реализации strategy)
  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet, метод service() и все методы doXXX()
  • javax.servlet.Filter#doFilter()
Visitor ( распознается по двум различным абстрактным или интерфейсным типам, которые содержат определенные методы, каждый из которых принимает абстрактный или интерфейсный тип; один из них вызывает метод другого и другой выполняет желаемую стратегию над первым)
  • javax.lang.model.element.AnnotationValue
  • javax.lang.model.element.AnnotationValueVisitor
  • javax.lang.model.element.Element   и javax.lang.model.element.ElementVisitor
  • javax.lang.model.type.TypeMirror и javax.lang.model.type.TypeVisitor

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

Читали всем офисом! респект!

я бы добавил decorator

Collections.synchronizedMap()

получает Коллекцию и возвращает ее в обертке с синхронизацией.

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке