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

我正在学习GoF Java设计模式,我想看到一些现实生活中的例子。Java核心库中有哪些设计模式的好例子?

547877 次浏览
  1. 整个摆动中的观察者模式(ObservableObserver)
  2. MVC也在摇摆
  3. 适配器模式:InputStreamReader和OutputStreamWriter 注意:ContainerAdapterComponentAdapterFocusAdapterKeyAdapterMouseAdapter适配器;它们实际上是空对象。Sun的命名选择很糟糕。
  4. 装饰器模式(BufferedInputStream可以装饰其他流,如FilterInputStream)
  5. 用于AWT工具包和Swing可插入外观类的AbstractFactory模式
  6. java.lang.Runtime#getRuntime()是单例
  7. ButtonGroup为中介模式
  8. ActionAbstractAction可以用于不同的可视化表示来执行相同的代码->命令模式
  9. JTable中用于Flyweight模式的Interned string或CellRender(也可以考虑各种池——线程池、连接池、EJB对象池——Flyweight实际上是关于共享资源的管理)
  10. Java 1.0事件模型是责任链的一个例子,Servlet过滤器也是。
  11. 集合框架中的迭代器模式
  12. AWT/Swing中的嵌套容器使用Composite模式
  13. AWT/Swing中的布局管理器就是策略的一个例子

我猜还有更多

抽象工厂模式被用在不同的地方。 例如,DatagramSocketImplFactoryPreferencesFactory。还有更多——在Javadoc中搜索名称中有单词“Factory”的接口

同样,工厂模式也有相当多的实例。

尽管我对这一点有点不熟悉,但Java XML API经常使用Factory。我是说看看这个:

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

...诸如此类。

此外,各种缓冲区(StringBuffer, ByteBuffer, StringBuilder)使用Builder。

  1. 轻量级选手用于字节,短,整数,长和字符串的一些值。
  2. 外观被用于许多地方,但最明显的是脚本接口。
  3. 单例 -想到java.lang.Runtime。
  4. 抽象工厂 -也脚本和JDBC API。
  5. 命令 - TextComponent的撤销/重做。
  6. 翻译 - RegEx (java.util.regex.)和SQL (java.sql。) API。
  7. 原型 -不是100%确定这是否算数,但我认为clone()方法可以用于此目的。

RMI是基于Proxy的。

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

  1. 抽象工厂:java。sql接口都是在注册驱动程序时从JDBC JAR中获得具体实现的。
  2. 建造者:java.lang.StringBuilder。
  3. 工厂方法:XML工厂等等。
  4. Prototype:可能是clone(),但我不确定我是否相信。
  5. 单例模式:有
  6. 适配器:java.awt中的适配器类。事件,例如,WindowAdapter。
  7. 桥:java.util中的集合类。由ArrayList实现的List。
  8. 综合:java.awt。java.awt.Component + java.awt.Container
  9. 装饰者:整个java。io包。
  10. 外观:ExternalContext表现为一个外观,用于执行cookie、会话范围和类似的操作。
  11. Flyweight:整数,字符等。
  12. 代理:java。rmi包
  13. 责任链:Servlet过滤器
  14. 命令:摆动菜单项
  15. 解释器:在JDK中没有直接使用,但是JavaCC肯定使用这个。
  16. 迭代器:java.util.Iterator接口;没有比这更清楚的了。
  17. 中介:JMS ?
  18. 纪念品:
  19. 观察者:java.util。观察者/可观察对象(尽管做得很糟糕)
  20. 状态:
  21. 策略:
  22. 模板:
  23. 参观者:

在这23个例子中,我想不出10个是用Java写的,但我会看看明天是否能做得更好。这就是编辑的作用。

您可以在维基百科中找到许多设计模式的概述。它还提到了GoF提到的模式。我将在这里总结它们,并尝试分配尽可能多的模式实现,这些实现在Java SE和Java EE api中都可以找到。


创建模式

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1


结构模式

# EYZ0 # EYZ1

# EYZ0 # EYZ1

  • 现在还想不起来。一个虚构的例子是new LinkedHashMap(LinkedHashSet<K>, List<V>),它返回一个不可修改的链接映射,它不克隆项目,而是使用它们。然而,java.util.Collections#newSetFromMap()singletonXXX()方法非常接近。

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1


行为模式

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

# EYZ0 # EYZ1

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

  • 抽象工厂

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