Я изучаю шаблоны проектирования GoF Java и хочу увидеть некоторые из них в реальной жизни. Каковы некоторые хорошие примеры этих шаблонов проектирования в основных библиотеках Java?
672
Я изучаю шаблоны проектирования GoF Java и хочу увидеть некоторые из них в реальной жизни. Каковы некоторые хорошие примеры этих шаблонов проектирования в основных библиотеках Java?
Вы можете найти обзор многих шаблонов дизайна в Википедии . Также упоминается, какие шаблоны упоминаются GoF. Я суммирую их здесь и попытаюсь назначить как можно больше реализаций шаблонов, как в Java SE, так и в Java EE API.
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
и 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)
(Возвращает одноэлементный объект по протоколу)java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller()
и другие подобные методыjava.lang.Object#clone()
(класс должен реализовать java.lang.Cloneable
)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()
методы.javax.servlet.http.HttpServletRequestWrapper
а также HttpServletResponseWrapper
javax.swing.JScrollPane
javax.faces.context.FacesContext
Он внутренне использует среди других абстрактных типов / интерфейса LifeCycle
, ViewHandler
, NavigationHandler
и многое другое без того , чтобы конечный пользователь должен беспокоиться об этом (которые , однако переписываемыми путем инъекции).javax.faces.context.ExternalContext
, Который используется внутри ServletContext
, HttpSession
, HttpServletRequest
, HttpServletResponse
и т.д.java.lang.Integer#valueOf(int)
(также на Boolean
, Byte
, Character
, Short
, Long
и BigDecimal
)java.lang.reflect.Proxy
java.rmi.*
javax.ejb.EJB
( объяснение здесь )javax.inject.Inject
( объяснение здесь )javax.persistence.PersistenceContext
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()
java.util.Date
(методы сеттера делают это, Date
внутренне представлены long
значением)java.io.Serializable
javax.faces.component.StateHolder
java.util.Observer
/ java.util.Observable
(хотя редко используется в реальном мире)java.util.EventListener
(практически во всем Swing)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
определяет посетителей;) Я не совсем уверен в том ,doXXX
иdoFilter
в «стратегии».Observable
,Observer
)ContainerAdapter
,ComponentAdapter
,FocusAdapter
,KeyAdapter
,MouseAdapter
являются не адаптеры; они на самом деле нулевые объекты. Плохой выбор имен от Sun.BufferedInputStream
может украшать другие потоки, такие какFilterInputStream
)java.lang.Runtime#getRuntime()
СинглтонButtonGroup
для образца медиатораAction
,AbstractAction
может использоваться для разных визуальных представлений для выполнения одного и того же кода -> Шаблон командыи многое другое, я думаю,
источник
clone()
метод может быть использован для этой цели.источник
java.awt
иjava.swing
пакеты. Действительно, они имеют почти идентичные внутренние атрибуты, а внешние атрибуты - это разные компоненты пользовательского интерфейса, которые они выкладывают в форме пользовательского интерфейса.RMI основан на Прокси.
Должна быть возможность процитировать один из 23 шаблонов в GoF:
Я не могу думать о примерах в Java для 10 из 23, но я посмотрю, смогу ли я добиться большего успеха завтра. Это то, что редактировать для.
источник
Шаблон Абстрактная фабрика используется в разных местах. Например,
DatagramSocketImplFactory
,PreferencesFactory
. Есть много других - ищите в Javadoc интерфейсы, в названии которых есть слово «Фабрика».Также есть немало примеров фабричной модели.
источник
Несмотря на то, что с этим часами у меня что-то не получается, Java XML API часто использует Factory. Я имею в виду, просто посмотрите на это:
...и так далее и тому подобное.
Кроме того, различные буферы (StringBuffer, ByteBuffer, StringBuilder) используют Builder.
источник
java.util.Collection # Iterator - хороший пример фабричного метода. В зависимости от конкретного подкласса Collection, который вы используете, он создаст реализацию Iterator. Поскольку и суперкласс Factory (Collection), и созданный Iterator являются интерфейсами, его иногда путают с AbstractFactory. Большинство примеров для AbstractFactory в принятом ответе (BalusC) являются примерами Factory , упрощенной версии Factory Method, которая не является частью оригинальных шаблонов GoF. В Facory иерархия классов фабрики свернута, и фабрика использует другие средства для выбора продукта, который будет возвращен.
Абстрактная фабрика имеет несколько фабричных методов, каждый из которых создает свой продукт. Продукты, произведенные на одном заводе, предназначены для совместного использования (ваш принтер и картриджи должны быть с одного (абстрактного) завода). Как упомянуто в ответах выше, семейства компонентов графического интерфейса пользователя AWT, отличающиеся от платформы к платформе, являются примером этого (хотя его реализация отличается от структуры, описанной в Gof).
источник