Java核心库中的GoF设计模式示例

时间:2009-11-04 13:45:53

标签: java oop design-patterns java-api

我正在学习GoF Java设计模式,我希望看到它们的一些真实例子。 Java核心库中的这些设计模式有哪些很好的例子?

7 个答案:

答案 0 :(得分:3053)

答案 1 :(得分:102)

  1. 整个秋千中的观察者模式(ObservableObserver
  2. MVC也在摇摆
  3. 适配器模式:InputStreamReader和OutputStreamWriter  注意:ContainerAdapterComponentAdapterFocusAdapterKeyAdapterMouseAdapter 不是适配器;它们实际上是Null Objects。 Sun的命名选择不佳。
  4. 装饰器模式(BufferedInputStream可以装饰其他流,例如FilterInputStream
  5. AWT Toolkit和Swing可插入外观类的AbstractFactory模式
  6. java.lang.Runtime#getRuntime()是Singleton
  7. ButtonGroup for Mediator pattern
  8. ActionAbstractAction可用于不同的可视化表示以执行相同的代码 - >命令模式
  9. 用于Flyweight模式的JTable中的Interned Strings或CellRender(还要考虑各种池 - 线程池,连接池,EJB对象池 - Flyweight实际上是关于共享资源的管理)
  10. Java 1.0事件模型是责任链的一个示例,Servlet过滤器也是如此。
  11. 集合框架中的迭代器模式
  12. AWT / Swing中的嵌套容器使用复合模式
  13. AWT / Swing中的布局管理器是战略的一个例子
  14. 还有更多我想

答案 2 :(得分:48)

  1. Flyweight 与Byte,Short,Integer,Long和String的某些值一起使用。
  2. Facade 在许多地方使用,但最明显的是脚本接口。
  3. Singleton - 想到了java.lang.Runtime。
  4. 抽象工厂 - 还有脚本和JDBC API。
  5. 命令 - TextComponent的撤消/重做。
  6. Interpreter - RegEx(java.util.regex。)和SQL(java.sql。)API。
  7. 原型 - 不是100%确定是否计算,但我认为clone()方法可以用于此目的。

答案 3 :(得分:40)

RMI基于代理。

应该可以引用GoF中23种模式中的大多数模式:

  1. Abstract Factory:java.sql interfaces在注册驱动程序时从JDBC JAR获取具体实现。
  2. Builder:java.lang.StringBuilder。
  3. 工厂方法:XML工厂等。
  4. 原型:也许克隆(),但我不确定我是买它。
  5. Singleton:java.lang.System
  6. 适配器:java.awt.event中的适配器类,例如WindowAdapter。
  7. Bridge:java.util中的集合类。列表由ArrayList实现。
  8. 复合:java.awt。 java.awt.Component + java.awt.Container
  9. 装饰者:遍布java.io包。
  10. Facade:ExternalContext表现为执行Cookie,会话范围和类似操作的外观。
  11. Flyweight:整数,字符等
  12. 代理:java.rmi包
  13. 责任链:Servlet过滤器
  14. 命令:Swing菜单项
  15. 解释器:不直接在JDK中,但JavaCC肯定会使用它。
  16. Iterator:java.util.Iterator接口;不能比那更清楚。
  17. 调解员:JMS?
  18. 纪念品:
  19. 观察者:java.util.Observer/Observable(虽然做得不好)
  20. 州:
  21. 策略:
  22. 模板:
  23. 访客:
  24. 我想不到23个中有10个用Java的例子,但我会明白我明天能否做得更好。这就是编辑的目的。

答案 4 :(得分:26)

抽象工厂模式用于各种场合。 例如,DatagramSocketImplFactoryPreferencesFactory。还有更多---在Javadoc中搜索名称中带有“Factory”字样的接口。

此外,还有很多工厂模式的实例。

答案 5 :(得分:21)

即使我是一个破坏时钟的人,Java XML API也经常使用Factory。我的意思是看看这个:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

......依此类推。

此外,各种Buffers(StringBuffer,ByteBuffer,StringBuilder)都使用Builder。

答案 6 :(得分:20)

java.util.Collection #teterator是工厂方法的一个很好的例子。根据您使用的Collection的具体子类,它将创建一个Iterator实现。因为Factory超类(Collection)和Iterator都是接口,所以它有时会与AbstractFactory混淆。在接受的答案(BalusC)中,AbstractFactory的大多数示例都是Factory的示例,它是Factory Method的简化版本,它不是原始GoF模式的一部分。在Facory中,工厂类层次结构已折叠,工厂使用其他方法选择要返回的产品。

  • 抽象工厂

抽象工厂有多个工厂方法,每个方法创建一个不同的产品。一家工厂生产的产品可以一起使用(您的打印机和墨盒最好来自同一个(抽象)工厂)。正如上面的答案中所提到的,不同平台的AWT GUI组件系列就是一个例子(虽然它的实现与Gof中描述的结构不同)。