Я изучаю шаблоны проектирования Java GoF, и я хочу увидеть некоторые примеры реальной жизни. Каковы некоторые хорошие примеры этих шаблонов проектирования в основных библиотеках Java?
Вы можете найти обзор многих шаблонов проектирования в Wikipedia. В нем также упоминается, какие шаблоны упоминаются GoF. Я подведу их здесь и попытаюсь назначить как можно больше реализаций шаблонов, найденных в API Java SE и Java EE.
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
) java.lang. Appendableкод>
java.util.stream.Stream.Builderкод>
java.util.Calendar # деЫпзЬапс()код>
java.text.NumberFormat # деЫпзЬапс()код>
java.net.URLStreamHandlerFactory # createURLStreamHandler (String)
(возвращает одноэлементный объект для каждого протокола) java. util.EnumSet # из()код>
javax.xml.bind.JAXBContext # createMarshaller()
и другие подобные методы. java.lang.Object # clone()
(класс должен реализовать java.lang.Cloneable
) java.lang.Runtime # getRuntime()код>
java.awt.desktop # getDesktop()код>
java.lang.System # getSecurityManager()код>
java.util.Arrays # asList()код>
java.io.InputStreamReader(InputStream)
(возвращает Reader
) java.io.OutputStreamWriter(OutputStream)
(возвращает Writer
) javax.xml.bind.annotation.adapters.XmlAdapter # marshal()
и #unmarshal()
новый LinkedHashMap (LinkedHashSet <K>, List <V>)
, который возвращает немодифицируемую связанную карту, которая не клонирует элементы, но использует их. java.util.Collections # newSetFromMap()код>
и singletonXXX()
, однако приближается. java.awt.Container # add (Component)
(практически все Swing таким образом) 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
и многое другое без того, что enduser должен беспокоиться об этом (которые, однако, могут быть отменены при инъекции). javax.faces.context.ExternalContext
, который использует ServletContext
, HttpSession
, HttpServletRequestкод>
, <код > HttpServletResponse и т.д. java. lang.Integer # valueOf (int)
(также на Boolean
, Байт
, Символ
, Short
, Long
и BigDecimal
) java.lang.reflect.Proxyкод>
java.rmi. *код>
javax.ejb.EJB
(объяснение здесь) javax.inject.Inject
(здесь) javax.persistence.PersistenceContext
java.lang. Runnableкод>
javax.swing. Действиекод>
java.util.Patternкод>
java.text.Normalizerкод>
java.text. Форматкод>
javax.el.ELResolverкод>
java.util. Iterator
(таким образом, среди других также <код > java.util.Scannerкод > !). java.util. Перечислениекод>
java.util.Timer
(все scheduleXXX()
) java.util.concurrent.ExecutorService
(методы invokeXXX()
и submit()
) java.util.concurrent.ScheduledExecutorService
(все scheduleXXX()
) java.lang.reflect.Method # invoke()
java.util.Date
(методы setter делают это, Date
внутренне представлен значением Long
) java.io. Сериализуемыйкод>
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 "Method Not Allowed". Вы можете реализовать ни одного или любого из них. 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
)ContainerAdapter
, ComponentAdapter
, FocusAdapter
, KeyAdapter
, MouseAdapter
не являются адаптерами; они фактически являются объектами Null. Плохой выбор названия для Sun.BufferedInputStream
может украшать другие потоки, такие как FilterInputStream
)java.lang.Runtime#getRuntime()
- SingletonButtonGroup
для шаблона медиатораAction
, AbstractAction
может использоваться для разных визуальных представлений для выполнения того же кода → Шаблон командыи многие другие, я думаю,
clone()
может быть использован для этой цели.java.awt
и java.swing
. Действительно, они имеют почти идентичные внутренние атрибуты, а внешние атрибуты - это разные компоненты пользовательского интерфейса, которые они выкладывают в форме пользовательского интерфейса.
RMI основан на прокси.
Должна быть указана одна из них для большинства 23 шаблонов в GoF:
Я не могу придумать примеры в Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Это то, что нужно для редактирования.
Абстрактный шаблон Factory используется в разных местах.
Например, DatagramSocketImplFactory
, PreferencesFactory
. Есть еще много --- поиск Javadoc для интерфейсов, которые имеют имя "Factory" в их имени.
Также имеется немало примеров шаблона Factory.
java.util.Collection # Итератор - хороший пример метода Factory. В зависимости от конкретного подкласса Collection, который вы используете, он создаст реализацию Iterator. Поскольку и суперкласс класса Factory (коллекция), и созданный Iterator являются интерфейсами, его иногда путают с AbstractFactory. Большинство примеров для AbstractFactory в принятом ответе (BalusC) являются примерами Factory, упрощенной версии метода Factory, который не является частью оригинальных шаблонов GoF. В Facory иерархия классов Factory сбрасывается, а Factory использует другие средства для выбора возвращаемого продукта.
Абстрактный Factory имеет несколько методов Factory, каждый из которых создает другой продукт. Продукты, созданные одним из Factory, предназначены для совместного использования (ваш принтер и картриджи лучше от одного и того же (аннотация) factory). Как упоминалось в ответах выше, примеры компонентов графического интерфейса AWT, отличающиеся от платформы к платформе, являются примером этого (хотя его реализация отличается от структуры, описанной в Gof).
Несмотря на то, что я вроде как сломанные часы с этим, Java XML API использует Factory много. Я имею в виду просто посмотреть на это:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
... и т.д. и т.д.
Кроме того, различные буферы (StringBuffer, ByteBuffer, StringBuilder) используют Builder.
javax.lang.model.element
определяет посетителей;) Я не совсем уверен,doXXX
лиdoXXX
иdoFilter
«стратегиями».doXXX()
иdoFilter()
вы в основном пишете алгоритм стратегии один. Сервер загружает и выполняет его.