本文主要对Java 设计模式以及在企业级软件开发中的应用场景进行简述。
一、创建型模式
创建型模式主要关注对象的创建过程,通过抽象创建过程,使得对象的创建与使用分离,从而提高代码的灵活性和可维护性。
- 单例模式(Singleton)
- 简述:确保一个类仅有一个实例,并提供全局访问点。
- 应用场景:在整个应用程序中,像配置管理类、日志记录类等,往往仅需一个实例,单例模式可防止资源浪费与冲突。
- 工厂模式(Factory)
- 简述:定义创建对象的接口,由子类决定实例化具体类。
- 应用场景:当对象创建过程繁杂,或要依据不同条件创建不同类型对象时适用,比如依据不同用户类型创建各异的用户对象。
- 抽象工厂模式(Abstract Factory)
- 简述:提供创建一系列相关或相互依赖对象的接口,无需指定具体类。
- 应用场景:例如创建不同操作系统下相关联的窗口、按钮、文本框等 UI 组件,用抽象工厂模式能统一管理创建过程。
- 建造者模式(Builder)
- 简述:将复杂对象的构建和其表示分离,使相同构建过程可创建不同表示。
- 应用场景:适用于创建包含多个部件的对象,如汽车对象,或包含多个配置选项的电脑对象,能更灵活地构建。
- 原型模式(Prototype)
- 简述:用原型实例指定创建对象的种类,通过拷贝原型创建新对象。
- 应用场景:当创建对象成本高,或需创建多个相似对象时,如创建数据库连接对象,利用原型模式克隆创建新对象可提升效率。
二、结构型模式
结构型模式主要关注对象的组合,通过将类或对象组合成更大的结构,以实现新的功能或优化现有结构。
- 适配器模式(Adapter)
- 简述:把一个类的接口转换为客户期望的另一个接口。
- 应用场景:当系统需使用现有类,但其接口与系统要求不符时,比如将旧系统接口适配到新系统中。
- 桥接模式(Bridge)
- 简述:将抽象部分和实现部分分离,使其能独立变化。
- 应用场景:在图形绘制系统中,图形的形状和颜色可作为两个独立变化的维度,桥接模式可将它们分离,实现各自独立变化。
- 组合模式(Composite)
- 简述:把对象组合成树形结构来表示 “部分 - 整体” 的层次结构。
- 应用场景:在文件系统中,文件和文件夹构成树形结构,组合模式可统一处理文件和文件夹。
- 装饰器模式(Decorator)
- 简述:动态地给对象添加额外职责。
- 应用场景:在不影响其他对象的情况下,若要动态为对象添加额外功能,如给窗口添加滚动条、边框等装饰时适用。
- 外观模式(Facade)
- 简述:为子系统中的一组接口提供统一界面。
- 应用场景:当复杂子系统有众多类和接口,而客户端仅需使用部分功能时,比如操作系统中,用户通过简单界面操作实现复杂系统功能。
- 享元模式(Flyweight)
- 简述:运用共享技术有效支持大量细粒度对象。
- 应用场景:系统中存在大量相同或相似对象,且其创建和销毁开销大时,例如游戏中的大量子弹对象,可通过享元模式共享相同属性,减少内存占用。
- 代理模式(Proxy)
- 简述:为其他对象提供代理以控制对该对象的访问。
- 应用场景:需要控制对象访问时,如远程代理、虚拟代理、保护代理等场景。
三、行为型模式
行为型模式主要关注对象之间的交互和职责分配,通过定义对象之间的通信方式和职责分配,使得系统更加灵活和可维护。
- 责任链模式(Chain of Responsibility)
- 简述:解除请求发送者和接收者之间的耦合,使多个对象都有机会处理请求。
- 应用场景:当一个请求需多个对象处理,且处理顺序不确定时,比如请假审批流程中,不同级别领导依次审批请假申请。
- 命令模式(Command)
- 简述:将请求封装为对象,可用不同请求对客户进行参数化。
- 应用场景:需要解耦请求调用者和接收者,且支持请求的撤销和重做,如文本编辑器中的撤销和重做操作。
- 解释器模式(Interpreter)
- 简述:给定语言,定义其文法表示,并定义解释器来解释语言中的句子。
- 应用场景:需要解释执行某种语言时,如编译器中解释执行脚本语言。
- 迭代器模式(Iterator)
- 简述:提供顺序访问聚合对象中各元素的方法,且不暴露对象内部表示。
- 应用场景:遍历聚合对象元素且不希望暴露其内部表示时,如遍历列表、数组等。
- 中介者模式(Mediator)
- 简述:用中介对象封装一系列对象交互。
- 应用场景:系统中对象间交互复杂,存在大量依赖关系时,比如聊天系统中,多个用户间的消息传递通过中介者管理。
- 备忘录模式(Memento)
- 简述:在不破坏封装性的前提下,捕获对象内部状态并在对象外保存。
- 应用场景:需要保存和恢复对象状态时,如文本编辑器中保存和恢复文本编辑历史。
- 观察者模式(Observer)
- 简述:定义对象间一对多的依赖关系,当一个对象状态改变时,依赖它的对象会收到通知并自动更新。
- 应用场景:当一个对象状态变化需通知其他对象进行相应处理时,如股票交易系统中,股票价格变化时通知关注该股票的投资者。
- 状态模式(State)
- 简述:允许对象在内部状态改变时改变其行为。
- 应用场景:对象行为取决于其状态,且需在运行时根据状态改变行为,如订单处理系统中,不同订单状态(待付款、已付款、已发货等)下操作不同。
- 策略模式(Strategy)
- 简述:定义一系列算法,封装起来并使其可相互替换。
- 应用场景:系统存在多个算法,需根据不同情况选择不同算法时,如电商系统中根据不同促销活动选择不同折扣算法。
- 模板方法模式(Template Method)
- 简述:定义操作算法的骨架,将一些步骤延迟到子类中实现。
- 应用场景:需要定义算法骨架,将部分步骤延迟到子类实现时,如游戏开发中,游戏角色行为定义模板方法,具体行为由子类实现。
- 访问者模式(Visitor)
- 简述:表示作用于对象结构中各元素的操作。
- 应用场景:需要对对象结构中的元素进行多种不同操作,且不希望在元素类中定义这些操作时,如在文件系统中对文件和文件夹进行统计文件大小、查找文件等不同操作。