Java 핵심 라이브러리의 GoF 설계 패턴 예시
저는 GoF Java Design Patterns를 배우고 있는데, 그 실제 사례를 보고 싶습니다.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()( , , , , , 및 에도)javax.swing.GroupLayout.Group#addComponent()- 의 모든 구현
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.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()그리고
다리 (다른 추상/인터페이스 타입의 인스턴스를 취하여 특정 인스턴스를 위임/사용하는 자체 추상/인터페이스 타입의 구현을 반환하는 크레디셔널 메서드에 의해 수정 가능)
- 아직 아무것도 생각나지 않는다.가상적인 예로는 다음과 같습니다.
new LinkedHashMap(LinkedHashSet<K>, List<V>)항목을 복제하지 않고 사용하는 수정할 수 없는 링크 맵을 반환합니다.단, 및 방법은 비슷합니다.
컴포지트 (동일한 추상/인터페이스 타입의 인스턴스를 트리 구조로 하는 동작 메서드에 의해 수정 가능)
java.awt.Container#add(Component)(실제로 스윙 전체에 걸쳐서)javax.faces.component.UIComponent#getChildren()(실제로 JSF UI 전체)
데코레이터 (동일한 추상/인터페이스 타입의 인스턴스를 사용하여 추가 동작을 추가하는 크레이제이션 메서드에 의해 조정 가능)
- 의 모든 서브클래스 및 컨스트럭터가 같은 유형의 인스턴스를 수신합니다.
java.util.Collections, 및 메서드.javax.servlet.http.HttpServletRequestWrapper그리고javax.swing.JScrollPane
전면 (서로 다른 독립된 추상/인터페이스 타입의 인스턴스를 내부적으로 사용하는 동작 메서드에 의해 조정 가능)
javax.faces.context.FacesContext, it internally uses among others the abstract/interface typesLifeCycle,ViewHandler,NavigationHandlerand many more without that the enduser has to worry about it (which are however overrideable by injection).- 내부에서는 , , , , 등을 사용합니다
javax.faces.context.ExternalContext.
플라이급 (캐시된 인스턴스를 반환하는 creational 메서드에 의해 수정 가능, 약간의 "instance" 아이디어)
java.lang.Integer#valueOf(int)( , , , , , 및 에도)
프록시 (소정의 추상/인터페이스 타입의 실장을 반환하고, 다음으로 소정의 추상/인터페이스 타입의 다른 실장을 위임/사용하는 크레디컬메서드에 의해 수정 가능)
java.lang.reflect.Proxyjava.rmi.*javax.ejb.EJB(여기서 설명)javax.inject.Inject(여기서 설명)javax.persistence.PersistenceContext
행동 패턴
책임계통 (큐내의 같은 추상/인터페이스 타입의 다른 실장에서도 같은 메서드를 (대부분) 호출하는 동작 메서드에 의해 검출 가능)
명령어 (생성 중에 명령어 실장에 의해 캡슐화된 다른 추상/인터페이스 타입의 실장에서의 메서드를 호출하는 추상/인터페이스 타입의 동작 메서드에 의해 해석 가능)
- 의 모든 구현
- 의 모든 구현
통역사 (특정 인스턴스/유형의 구조적으로 다른 인스턴스/유형을 반환하는 동작방법에 의해 수정이 가능합니다.파싱/포맷은 패턴의 일부가 아니며 패턴의 판별 및 적용방법에 주의해 주십시오).
java.util.Patternjava.text.Normalizer- 의 모든 서브클래스
- 의 모든 서브클래스
반복기 (큐에서 다른 유형의 인스턴스를 순차적으로 반환하는 동작 방법에 의해 수정 가능)
- 의 모든 실장(다른 실장도 마찬가지입니다.
- 의 모든 구현
중개자 (특정 인스턴스를 위임/사용하는 다른 추상/인터페이스 타입의 인스턴스(보통 명령어패턴을 사용)를 취하는 동작 메서드에 의해 수정 가능)
java.util.Timer(모두scheduleXXX()메서드)java.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService(the)invokeXXX()그리고.submit()메서드)java.util.concurrent.ScheduledExecutorService(모두scheduleXXX()메서드)java.lang.reflect.Method#invoke()
기념품 (인스턴스 전체의 상태를 내부적으로 변화시키는 행동 방법에 의해 수정 가능)
java.util.Date(세터 메서드는 그렇게 합니다).Date내부적으로는 에 의해 대표된다.long값)- 의 모든 구현
- 의 모든 구현
옵서버(또는 공개/구독) (자신의 상태에 따라 다른 추상/인터페이스 타입의 인스턴스에서 메서드를 호출하는 동작 메서드에 의해 수정 가능)
java.util.Observer/java.util.Observable(실제에서 사용되는 기능)- 의 모든 구현(실질적으로 Swing 전체에 걸쳐)
javax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListener
주 (외부적으로 제어할 수 있는 인스턴스의 상태에 따라 동작을 변경하는 행동 방법에 의해 조정 가능)
javax.faces.lifecycle.LifeCycle#execute()(에 의해 제어되며, 동작은 JSF 라이프사이클의 현재 단계(상태)에 따라 달라집니다.)
전략. (전략 구현에 메서드 인수로 전달된 다른 추상/인터페이스 유형의 구현에서 메서드를 호출하는 추상/인터페이스 유형의 행동 메서드에 의해 해석 가능)
- 에 의해 실행되었습니다
java.util.Comparator#compare().Collections#sort(). javax.servlet.http.HttpServlet, ,service()그리고 모든 것doXXX()방법이 필요하다HttpServletRequest그리고.HttpServletResponse그리고 구현자는 그것들을 처리해야 합니다(인스턴스 변수로 입수하지 마십시오).javax.servlet.Filter#doFilter()
템플릿 방식 (추상형에서 이미 정의된 "기본" 동작을 가진 행동 메서드에 의해 수정 가능)
- , 및 의 모든 비추상 메서드.
- , 및 의 모든 비추상 메서드.
javax.servlet.http.HttpServlet, 모든 것doXXX()기본적으로는 메서드는 HTTP 405 "Method Not Allowed" 오류를 응답으로 전송합니다.어느 것도, 어느 것도 실장할 수 없습니다.
방문자 (서로 다른 추상/인터페이스 타입을 취하는 메서드가 정의되어 있는2개의 다른 추상/인터페이스 타입에 의해 실현 가능.한쪽은 실제로 다른 한쪽의 메서드를 호출하고 다른 한쪽은 그 위에서 원하는 전략을 실행합니다.
javax.lang.model.element.AnnotationValue그리고javax.lang.model.element.Element그리고javax.lang.model.type.TypeMirror그리고java.nio.file.FileVisitor그리고javax.faces.component.visit.VisitContext그리고
- 스윙 전체에 걸친 관찰자 패턴(
Observable,Observer) - MVC도 가동 중
- 어댑터 패턴:InputStreamReader 및 OutputStreamWriter 주의:
ContainerAdapter,ComponentAdapter,FocusAdapter,KeyAdapter,MouseAdapter어댑터가 아닙니다.실제로 Null 객체입니다.Sun의 잘못된 이름 선택. - 데코레이터 패턴(
BufferedInputStream등의 다른 스트림을 장식할 수 있다FilterInputStream) - AWT 툴킷 및 Swing 플러그형 룩앤필 클래스용 AbstractFactory 패턴
java.lang.Runtime#getRuntime()is SingletonButtonGroupfor Mediator patternAction,AbstractActionmay be used for different visual representations to execute same code -> Command pattern- Interned Strings or CellRender in JTable for Flyweight Pattern (Also think about various pools - Thread pools, connection pools, EJB object pools - Flyweight is really about management of shared resources)
- The Java 1.0 event model is an example of Chain of Responsibility, as are Servlet Filters.
- Iterator pattern in Collections Framework
- Nested containers in AWT/Swing use the Composite pattern
- Layout Managers in AWT/Swing are an example of Strategy
and many more I guess
- Flyweight is used with some values of Byte, Short, Integer, Long and String.
- Facade is used in many place but the most obvious is Scripting interfaces.
- Singleton - java.lang.Runtime comes to mind.
- Abstract Factory - Also Scripting and JDBC API.
- Command - TextComponent's Undo/Redo.
- Interpreter - RegEx (java.util.regex.) and SQL (java.sql.) API.
- Prototype - Not 100% sure if this count, but I thinkg
clone()method can be used for this purpose.
RMI is based on Proxy.
Should be possible to cite one for most of the 23 patterns in GoF:
- Abstract Factory: java.sql interfaces all get their concrete implementations from JDBC JAR when driver is registered.
- Builder: java.lang.StringBuilder.
- Factory Method: XML factories, among others.
- Prototype: Maybe clone(), but I'm not sure I'm buying that.
- Singleton: java.lang.System
- Adapter: Adapter classes in java.awt.event, e.g., WindowAdapter.
- Bridge: Collection classes in java.util. List implemented by ArrayList.
- Composite: java.awt. java.awt.Component + java.awt.Container
- Decorator: All over the java.io package.
- Facade: ExternalContext behaves as a facade for performing cookie, session scope and similar operations.
- Flyweight: Integer, Character, etc.
- Proxy: java.rmi package
- Chain of Responsibility: Servlet filters
- Command: Swing menu items
- Interpreter: No directly in JDK, but JavaCC certainly uses this.
- Iterator: java.util.Iterator interface; can't be clearer than that.
- Mediator: JMS?
- Memento:
- 옵서버: java.util.관찰자/관찰 가능(단, 잘못 실행됨)
- 상태:
- 전략:
- 템플릿:
- 방문자:
자바에서 23개 중 10개의 예가 생각나지 않지만 내일 더 잘 할 수 있는지 알아보겠습니다.그게 편집의 목적입니다.
Abstract Factory 패턴은 다양한 장소에서 사용됩니다.예.,DatagramSocketImplFactory,PreferencesFactory그 밖에도 여러 가지가 있습니다.Javadoc에서 이름에 "Factory"라는 단어가 있는 인터페이스를 검색하십시오.
또한 Factory 패턴의 사례도 꽤 있습니다.
이 클럭은 고장났지만 Java XML API는 Factory를 많이 사용합니다.내 말은 이것 좀 봐
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
... 등등.
또한 다양한 버퍼(StringBuffer, ByteBuffer, StringBuilder)에서 Builder를 사용합니다.
java.displaces를 클릭합니다.수집#Iterator는 공장 출하시 방법의 좋은 예입니다.사용하는 컬렉션의 구체적인 하위 클래스에 따라 반복기 구현이 만들어집니다.Factory superclass(Collection)와 Iterator가 모두 인터페이스이기 때문에 Abstract Factory와 혼동될 수 있습니다.승인된 답변(BalusC)의 Abstract Factory 예는 대부분 Factory의 예입니다.Factory Method의 간략화된 버전입니다.Factory는 원래 GoF 패턴의 일부가 아닙니다.Facory에서는 Factory 클래스 계층이 축소되고 공장에서는 다른 수단을 사용하여 반품할 제품을 선택합니다.
- 추상 공장
추상 공장에는 여러 공장 방법이 있으며 각각 다른 제품을 만듭니다.1개의 공장에서 생산되는 제품은, 함께 사용하는 것을 목적으로 하고 있습니다(프린터와 카트리지는 같은(추상) 공장에서 생산되는 것이 좋습니다).위의 답변에서 설명한 바와 같이 플랫폼마다 다른AWT GUI 컴포넌트 패밀리가 그 예입니다(그 실장은 Gof에서 설명한 구조와는 다릅니다).
언급URL : https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
'programing' 카테고리의 다른 글
| nuxt auth 모듈을 사용하여 인증 상태를 검출하기 위해 새로 고침 필요 (0) | 2022.08.16 |
|---|---|
| Vue 지시문 - 문자열로 전달 (0) | 2022.08.16 |
| Vue + Jest 정의되지 않은 속성 '기본값'을 읽을 수 없습니다. (0) | 2022.08.16 |
| vue-router보다 먼저 무언가를 실행하는 방법 (0) | 2022.08.16 |
| Vue.js & Vuex - 액세스 토큰을 스토어에 저장하고 사용자를 URL로 리다이렉트하여 로그인을 합니다. (0) | 2022.08.16 |