代码之家  ›  专栏  ›  技术社区  ›  Wayne

Java核心库中GOF设计模式的实例

  •  672
  • Wayne  · 技术社区  · 7 年前

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

    7 回复  |  直到 7 年前
        1
  •  3005
  •   BalusC    7 年前

    您可以在中找到许多设计模式的概述 Wikipedia . 它还提到了GOF提到的模式。我将在这里对它们进行总结,并尝试在Java SE和Java EE API中找到尽可能多的模式实现。


    Creational patterns

    Abstract factory (可通过返回工厂本身的创建方法识别,而工厂本身又可用于创建另一个抽象/接口类型)

    Builder (可通过返回实例本身的创建方法识别)

    Factory method (可通过返回抽象/接口类型实现的创建方法识别)

    Prototype (可通过返回 不同的 具有相同属性的自身实例)

    Singleton (可通过返回 相同的 每次(通常是自己的)实例


    Structural patterns

    Adapter (可通过创造方法识别,例如 不同的 抽象/接口类型并返回自己/另一个抽象/接口类型的实现,其中 装饰/覆盖 给定实例)

    Bridge (可通过创造方法识别,例如 不同的 抽象/接口类型并返回自己的抽象/接口类型的实现, 代表/用途 给定实例)

    Composite (可通过行为方法识别,以 相同的 抽象/接口类型转换为树结构)

    Decorator (可通过创造方法识别,例如 相同的 添加附加行为的抽象/接口类型)

    Facade (可通过内部使用的行为方法识别 不同的 独立的抽象/接口类型)

    Flyweight (可通过返回缓存实例的创建方法识别,有点“多功能”的想法)

    Proxy (可通过创建方法识别,该方法返回给定抽象/接口类型的实现,反过来 代表/用途 不同的 给定抽象/接口类型的实现)


    Behavioral patterns

    Chain of responsibility (可通过行为方法(间接)调用 另一个 执行 相同的 队列中的抽象/接口类型)

    Command (可由抽象/接口类型中的行为方法识别,该抽象/接口类型在 不同的 抽象/接口类型 包封的 在创建过程中通过命令实现)

    Interpreter (可通过返回 在结构上 给定实例/类型的不同实例/类型;请注意,解析/格式化不是模式的一部分,它决定了模式以及如何应用模式)

    Iterator (可由行为方法识别,按顺序返回 不同的 从队列中键入)

    Mediator (可通过采用不同抽象/接口类型(通常使用命令模式)的实例的行为方法识别,该实例委托/使用给定实例)

    Memento (可通过行为方法识别,其内部改变了 整体 实例)

    Observer (or Publish/Subscribe) (可由在实例上调用方法的行为方法识别) 另一个 抽象/接口类型,取决于自己的状态)

    State (可通过行为方法识别,根据实例的状态改变其行为,该状态可由外部控制)

    Strategy (可由抽象/接口类型中的行为方法识别,该抽象/接口类型在 不同的 抽象/接口类型 通过 作为策略实施的方法论证)

    Template method (可由行为方法识别,该行为方法已经具有由抽象类型定义的“默认”行为)

    Visitor (可被两个人识别 不同的 定义了方法的抽象/接口类型,这些方法 其他 抽象/接口类型;一个调用另一个的方法,另一个对其执行所需的策略)

        2
  •  100
  •   longday    8 年前
    1. 整个挥杆过程中的观察者模式( Observable , Observer )
    2. MVC也在摇摆
    3. 适配器模式:inputstreamreader和outputstreamwriter 注: ContainerAdapter ,请 ComponentAdapter , FocusAdapter ,请 KeyAdapter , MouseAdapter 适配器;它们实际上是空对象。孙的命名选择不好。
    4. 装饰图案( BufferedInputStream 可以装饰其他溪流,如 FilterInputStream )
    5. 为awt工具箱和Swing-Pluggable Look and Feel类抽象工厂模式
    6. java.lang.Runtime#getRuntime() 是Singleton吗
    7. ButtonGroup 对于中介模式
    8. Action , AbstractAction 可用于不同的视觉表示,以执行相同的代码->命令模式
    9. jtable for flyweight模式中的内部字符串或cellrender(还可以考虑各种池-线程池、连接池、EJB对象池-flyweight实际上是关于共享资源的管理)
    10. Java 1事件模型是Servlet过滤器的一个责任链的例子。
    11. 集合框架中的迭代器模式
    12. awt/swing中的嵌套容器使用复合模式
    13. awt/swing中的布局管理器是策略的一个例子

    我想还有更多

        3
  •  48
  •   NawaMan    16 年前
    1. 飞锤 与字节、短、整数、长和字符串的某些值一起使用。
    2. 外观 在许多地方使用,但最明显的是脚本接口。
    3. 独生子女 -我想到了java.lang.runtime。
    4. 抽象工厂 -还有脚本和JDBCAPI。
    5. 命令 -text组件的撤消/重做。
    6. 解释器 -regex(java.util.regex. )和SQL(java.sql. )美国石油学会。
    7. 原型 -不完全确定这算不算,但我想 clone() 方法可用于此目的。
        4
  •  40
  •   duffymo    13 年前

    RMI基于代理。

    在GoF的23种模式中,应该可以引用一种模式:

    1. 抽象工厂:java.sql接口在注册驱动程序时都从jdbc jar获得具体的实现。
    2. 生成器:java.lang.StringBuilder。
    3. 工厂方法:XML工厂等。
    4. 原型:也许是clone(),但我不确定我会买这个。
    5. singleton:java.lang.system
    6. adapter:java.awt.event中的适配器类,例如windowadapter。
    7. 桥:java.util中的集合类。由ArrayList实现的列表。
    8. 复合:java.awt。java.awt.component+java.awt.container
    9. decorator:整个java.io包。
    10. 外观: ExternalContext 作为执行cookie、会话范围和类似操作的外观。
    11. 飞锤:整数、字符等。
    12. 代理:java.rmi包
    13. 责任链:servlet过滤器
    14. 命令:Swing菜单项
    15. 解释器:JDK中没有,但Javacc肯定会使用这个。
    16. 迭代器:java.util.迭代器接口;不能比这个更清楚。
    17. 调解员:JMS?
    18. Memento:
    19. observer:java.util.observer/observable(虽然做得不好)
    20. 状态:
    21. 策略:
    22. 模板:
    23. 参观者:

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

        5
  •  26
  •   Sembiance    9 年前

    抽象的工厂模式在不同的地方使用。 例如。, DatagramSocketImplFactory , PreferencesFactory .还有很多——在javadoc中搜索名称中包含“工厂”一词的接口。

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

        6
  •  21
  •   Esko    16 年前

    尽管我是一个坏了的时钟,但是JavaXML API使用了很多工厂。我是说,看看这个:

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

    …等等。

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

        7
  •  20
  •   Chris    15 年前

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

    • 抽象工厂

    抽象工厂有多个工厂方法,每个方法创建不同的产品。一家工厂生产的产品打算一起使用(您的打印机和墨盒最好来自同一家(摘要)工厂)。如上述答案所述,不同平台的awt gui组件系列就是一个例子(尽管其实现与gof中描述的结构不同)。

    推荐文章