unj*_*nj2 672 java oop design-patterns java-api
我正在学习GoF Java设计模式,我想看看它们的一些真实例子.Java核心库中这些设计模式的一些很好的例子是什么?
Bal*_*usC 3135
您可以在维基百科中找到许多设计模式的概述.它还提到了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.Appendablejava.util.stream.Stream.Builderjava.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.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) (几乎所有的Swing因此)javax.faces.component.UIComponent#getChildren() (几乎遍布JSF UI)java.io.InputStream, OutputStream, Reader and Writer have a constructor taking an instance of same type.java.util.Collections, the checkedXXX(), synchronizedXXX() and unmodifiableXXX() methods.javax.servlet.http.HttpServletRequestWrapper and HttpServletResponseWrapperjavax.swing.JScrollPanejavax.faces.context.FacesContext, it internally uses among others the abstract/interface types LifeCycle, ViewHandler, NavigationHandler and many more without that the enduser has to worry about it (which are however overrideable by injection).javax.faces.context.ExternalContext, which internally uses ServletContext, HttpSession, HttpServletRequest, HttpServletResponse, etc.java.lang.Integer#valueOf(int) (also on Boolean, Byte, Character, Short, Long and BigDecimal)java.lang.reflect.Proxyjava.rmi.*javax.ejb.EJB (explanation here)javax.inject.Inject (explanation here)javax.persistence.PersistenceContextjava.lang.Runnablejavax.swing.Actionjava.util.Patternjava.text.Normalizerjava.text.Formatjavax.el.ELResolverjava.util.Iterator (thus among others also java.util.Scanner!).java.util.Enumerationjava.util.Timer (all scheduleXXX() methods)java.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService (the invokeXXX() and submit() methods)java.util.concurrent.ScheduledExecutorService (all scheduleXXX() methods)java.lang.reflect.Method#invoke()java.util.Date (the setter methods do that, Date is internally represented by a long value)java.io.Serializablejavax.faces.component.StateHolderjava.util.Observer/java.util.Observable (rarely used in real world though)java.util.EventListener (practically all over Swing thus)javax.servlet.http.HttpSessionBindingListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.faces.event.PhaseListenerjit*_*ter 105
Observable,Observer)ContainerAdapter,ComponentAdapter,FocusAdapter,KeyAdapter,MouseAdapter是不适配器; 它们实际上是Null Objects.Sun的命名选择不佳.BufferedInputStream可以装饰其他流等FilterInputStream)java.lang.Runtime#getRuntime() 是辛格尔顿ButtonGroup 对于Mediator模式Action,AbstractAction可用于不同的可视化表示来执行相同的代码 - >命令模式还有更多我猜
Naw*_*Man 50
clone()方法可以用于此目的.duf*_*ymo 41
RMI基于代理.
对于GoF中的23种模式中的大多数,应该可以引用一种:
我不能想到23个中有10个用Java的例子,但我会明白我明天能不能做得更好.这就是编辑的目的.
uck*_*man 27
抽象工厂模式用于各种地方.例如DatagramSocketImplFactory,PreferencesFactory.还有更多---在Javadoc中搜索名称中带有"Factory"字样的接口.
此外,还有很多工厂模式的实例.
Esk*_*sko 22
即使我有一个破坏时钟,Java XML API使用Factory很多.我的意思是看看这个:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
Run Code Online (Sandbox Code Playgroud)
...等等等等.
另外,各种Buffers(StringBuffer,ByteBuffer,StringBuilder)使用Builder.
Cat*_*zle 21
java.util.Collection #teterator是Factory方法的一个很好的例子.根据您使用的Collection的具体子类,它将创建一个Iterator实现.因为Factory超类(Collection)和Iterator都是接口,所以它有时会与AbstractFactory混淆.在接受的答案(BalusC)中,AbstractFactory的大多数示例都是Factory的示例,它是Factory Method的简化版本,它不是原始GoF模式的一部分.在Facory中,工厂类层次结构已折叠,工厂使用其他方法选择要返回的产品.
抽象工厂有多种工厂方法,每种方法都可以创建不同的产品.一家工厂生产的产品可以一起使用(您的打印机和墨盒最好来自同一个(抽象)工厂).正如上面的答案中所提到的,不同平台的AWT GUI组件系列就是一个例子(虽然它的实现与Gof中描述的结构不同).
| 归档时间: |
|
| 查看次数: |
487337 次 |
| 最近记录: |