这些经典的设计模式是每个开发人员都应该了解的,因为它有助于我们与其他开发人员在抽象层面进行沟通,并且使我们成为更好的设计师。
Note:添加带有现实生活和 Java API 示例的简短定义。
创意型
创建对象的方式,同时隐藏创建逻辑。
原型 :要复制或克隆的完全初始化的实例
示例:一家面包店使用原型蛋糕来制作新蛋糕。
Builder- 将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。
示例:一个软件开发团队使用各种库和框架创建新软件。
辛格尔顿- 只能存在一个实例的类
示例:国家总统
- java.lang.Runtime#getRuntime()
工厂方法- 创建一个f对象类型族。
示例:在组织中,人力资源部门采用工厂方法。这里开发团队向 HR 请求所需的资源类型。根据请求类型,人力资源部门向开发团队提供资源。
- java.util.Calendar#getInstance()
抽象工厂- 创建多个类系列的实例
示例:HP、Samsung 和 Dell 笔记本电脑均使用 Intel 和 AMD 处理器。
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
工厂方法与抽象工厂 https://stackoverflow.com/a/5740020/1697099
结构性
结构模式有助于从小对象创建大对象(即基础设施)。
Proxy- 在客户端和服务之间引入代理层以添加缓存或安全等功能。
合成的- 为叶子和复合体提供统一的接口。
将对象组合成树结构以表示部分-整体层次结构,即对象既表示部分又表示整体。
示例:操作系统中的文件系统,目录是复合的,文件是叶子。系统调用Open
复合材料和叶子的单一接口。
装饰者- 装饰器设计模式用于通过在核心类周围包装另一个类来添加功能,而不修改核心类。
示例:1) 添加d订单折扣 2) 枪支本身就是一种致命武器。但你可以应用某些“装饰”,使其更加准确、安静和具有破坏性。
- java.io.InputStream、OutputStream、Reader 和的所有子类
Writer 有一个构造函数,采用相同类型的实例。
Facade- 为子系统中的一组接口提供统一的接口,使子系统更易于使用。
示例:控制面板、事件管理器。
- javax.faces.context.ExternalContext,内部使用
ServletContext、HttpSession、HttpServletRequest、HttpServletResponse、
等
Adapter- 当两个不相关的接口需要一起工作时,使用适配器模式。
示例:电源适配器
- java.util.Arrays#asList()
蝇量级- 空间优化技术,让我们通过共享数据使用更少的内存。
示例:软件开发团队使用数据库连接池来减少创建和关闭新连接的开销。
- java.lang.Integer#valueOf(int) (也适用于布尔值、字节、字符、
短和长)
行为的
行为模式特别关注对象之间的通信,有助于松散耦合。
责任链用于沿着处理程序链传递请求。
示例:贷款或休假审批流程、Java 中的异常处理。
- javax.servlet.Filter#doFilter()
Iterator- 遍历/顺序访问集合的元素
示例:编程语言中的 for 循环
- java.util.Iterator 和 java.util.Enumeration 的所有实现
State- 允许对象在其内部状态改变时改变其行为
示例:循环显示红色、黄色和绿色状态的交通灯。
一种自动售货机,可以在闲置、收款、分发产品和缺货状态之间切换。
电子游戏角色可以处于站立、行走、奔跑、跳跃等状态。
Observer- 对象之间一对多的依赖关系,这样当一个对象改变状态时,它的所有依赖对象都会得到通知并自动更新
示例:社交媒体平台
Visitor- 访问者模式用于向不同类型的类添加方法,而无需更改这些类。
示例:对不同类型的数据执行不同操作的数据库。
呈现不同类型 HTML 元素的 Web 浏览器。
Template- 定义操作中算法的骨架,并将一些步骤推迟到子类中。
示例:烹饪食谱,提供准备菜肴的分步模板。
软件开发生命周期,提供用于开发和交付软件的模板。
- java.io.InputStream、java.io.OutputStream、java.io.Reader 和 java.io.Writer 的所有非抽象方法。
- java.util.AbstractList、java.util.AbstractSet 和 java.util.AbstractMap 的所有非抽象方法。
- javax.servlet.http.HttpServlet,所有 doXXX() 方法默认都会向响应发送 HTTP 405“方法不允许”错误。您可以自由地不实施它们或实施其中任何一个。
- Spring 中的 JMSTemplate HibernateTemplate 和 JdbcTemplate
Command- 当请求被包装并传递给调用者时使用命令模式,调用者随后调用封装的命令。
示例:遥控器
Memento- 备忘录模式用于将对象的状态恢复到之前的状态。
示例:在 Windows 中保存游戏状态和撤消/重做操作,允许用户撤消和重做其操作的文本编辑器。允许用户回滚事务的数据库。
Mediator- 中介者模式用于在不同对象之间提供集中式通信媒介。
示例:空中交通管制员(ATC)、证券交易所
Strategy- 当我们对特定任务有多种算法并且客户端决定在运行时使用的实际实现时,使用策略模式。
示例:交通方式
- java.util.Comparator#compare(),由 Collections#sort() 等执行。
- javax.servlet.http.HttpServlet、service() 和所有 doXXX() 方法都采用 HttpServletRequest 和 HttpServletResponse,并且实现者必须处理它们(而不是将它们作为实例变量来获取!)。
- javax.servlet.Filter#doFilter()
Java 实现的设计模式 https://stackoverflow.com/a/2707195/1697099
带有简单示例的设计模式 https://refactoring.guru/design-patterns
有用的链接https://gitorko.github.io/post/design-patterns https://gitorko.github.io/post/design-patterns