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

В интернете существует множество материалов, посвященных шаблонам проектирования (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
Конец
Материалы, которые могут вас заинтересовать
- Вопрос: Восходящее преобразование и generic
- Играем в компилятор.
- Аргументы методов в Java : pass-by-value or pass-by-reference
- Все о String.intern()
- Java. Как создать объект обобщенного типа? How is a generic type instantiated?
- Java. Что такое параметризированный или обобщенный тип? / What is a parameterized or generic type?
- Java. Что такое дженерики? / What is Java Generics?
- Java. Замена символов в строке / Replacing characters in string
- Java. Как получить путь к проекту? / How to get project path?







Читали всем офисом! респект!
я бы добавил decorator
Collections.synchronizedMap()
получает Коллекцию и возвращает ее в обертке с синхронизацией.
Отправить комментарий