设计模式根据其目的和用途分为创建型、结构型和行为型三种类型,它们的区别如下:
创建型设计模式
- 目的:主要用于对象的创建过程,将对象的创建和使用分离。其关注点在于如何创建对象,通过特定的方式来控制对象的创建过程,比如隐藏对象创建的复杂细节、确保对象的唯一性等。
- 常见模式:
- 单例模式:保证一个类仅有一个实例,并提供一个全局访问点。例如,在数据库连接池的实现中,为了避免过多的数据库连接资源浪费,通常会使用单例模式确保只有一个连接池实例。
- 工厂模式:包括简单工厂、工厂方法和抽象工厂。工厂模式将对象的创建逻辑封装在工厂类中,客户端通过工厂类创建对象,而不需要了解对象创建的具体细节。如游戏开发中,通过一个角色工厂来创建不同类型的游戏角色。
- 建造者模式:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。例如,在构建一个复杂的用户对象时,该对象可能有姓名、年龄、地址、联系方式等多个属性,使用建造者模式可以方便地构建不同配置的用户对象。
- 解决的问题:创建型模式解决的是对象创建过程中的复杂性、灵活性以及资源管理等问题,使得对象的创建过程更易于维护和扩展。
结构型设计模式
- 目的:主要用于处理类或对象的组合结构,通过将类或对象组织成更大的结构,以实现功能增强或优化。其重点在于如何将类或对象组合在一起,形成更复杂的结构,同时保持结构的灵活性和可维护性。
- 常见模式:
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。例如,在网络访问中,当访问一些外部资源时,可能由于权限、性能等原因,通过代理服务器来代替直接访问目标资源。
- 装饰器模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。比如,在一个图形绘制系统中,为了给一个基本图形(如圆形)添加阴影、边框等额外效果,可以使用装饰器模式。
- 适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。例如,在将旧的支付接口适配到新的支付系统中,适配器模式就可以发挥作用。
- 解决的问题:结构型模式解决的是如何将类或对象组织成更高效、灵活的结构,以满足不同的功能需求,提高代码的复用性和可维护性。
行为型设计模式
- 目的:主要用于处理对象之间的交互和职责分配,关注对象之间如何进行通信、协作以及如何分配职责,以实现特定的行为。其核心是通过对象之间的交互来完成复杂的任务,而不是关注对象的创建和结构。
- 常见模式:
- 观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。例如,在社交媒体平台上,当一个用户发布新内容时,关注该用户的其他用户会收到通知。
- 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。比如,在一个电商系统中,根据不同的促销活动,选择不同的折扣计算策略。
- 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。例如,在一个文件处理系统中,读取文件、处理文件内容、保存文件的基本流程是固定的,但不同类型文件(如文本文件、二进制文件)的具体处理方式可以在子类中实现。
- 解决的问题:行为型模式解决的是对象之间的交互复杂性、职责分配合理性以及行为的可扩展性等问题,使系统的行为更加清晰、易于维护和扩展。
创建型设计模式侧重于对象的创建过程,结构型设计模式关注对象和类的组合结构,行为型设计模式则聚焦于对象之间的交互和职责分配。它们从不同角度为软件设计提供了有效的解决方案,帮助开发者构建更加灵活、可维护和可扩展的软件系统。