设计模式对比

创建型对比

模式 定义 优点 缺点 应用场景
单例模式 确保一个类仅有一个实例,并提供一个全局访问点 节约系统资源,提高系统性能;提供对唯一实例的受控访问 不易扩展,特别是当需要不同实例时;滥用单例可能会导致资源溢出或状态丢失 系统只需一个实例对象,如配置文件的读取、数据库连接池等
工厂方法模式 定义一个用于创建对象的接口,让子类决定实例化哪一个类 隐藏了对象的创建细节,降低了耦合度;易于扩展,增加新产品时只需添加新的具体工厂和具体产品 增加了系统的复杂度,因为每增加一个产品,就需要增加一个具体工厂和具体产品 客户端不知道它所需要的对象的类
抽象工厂模式 供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 易于交换产品系列,分离了具体类的创建和使用 增加了系统的抽象性和理解难度,需要添加新产品族时,需要修改抽象工厂的接口 系统功能结构稳定,不需要频繁新增功能,但需要支持多种产品族
原型模式(Prototype) 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象 创建通过复制,提高了新建的效率 每个类都需要实现克隆方法,增加了实现的复杂度 对象相似,可以通过复制加修改实现的对象创建
建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 封装了复杂对象的创建过程,易于扩展,增加新的构建部分不需要修改现有的类 如果产品内部变化复杂,会增加系统的难度和运行成本 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式

结构型对比

结构型模式用于描述如何将类或对象结合在一起形成更大的结构

模式 定义 优点 缺点 应用场景
代理模式(Proxy) 为其他对象提供一种代理以控制对这个对象的访问 降低耦合度,扩展性好 处理速度可能变慢,因为需要通过代理访问实际对象 远程代理,虚拟代理,安全代理等
工厂方法模式 定义一个用于创建对象的接口,让子类决定实例化哪一个类 隐藏了对象的创建细节,降低了耦合度;易于扩展,增加新产品时只需添加新的具体工厂和具体产品 增加了系统的复杂度,因为每增加一个产品,就需要增加一个具体工厂和具体产品 客户端不知道它所需要的对象的类
适配器模式(Adapter) 将一个类的接口转换成客户端所期待的另一种接口形式,使因接口不匹配而不能在一起工作的类可以一起工作 灵活性、扩展性好 不支持多重继承 系统的数据和行为都正确,但接口不符
装饰模式(Decorator) 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 装饰类和被装饰类可以独立发展,不会相互耦合 会产生较多的装饰类 封装了复杂对象的创建过程,易于扩展,增加新的构建部分不需要修改现有的类

行为型模式

结构型模式用于描述如何将类或对象结合在一起形成更大的结构

模式 定义 优点
策略模式(Strategy) 定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 算法可以独立变化,不影响客户端

相关推荐

  1. 设计模式对比

    2024-07-09 23:48:01       21 阅读
  2. 面向对象——设计模式

    2024-07-09 23:48:01       42 阅读
  3. 面向对象设计模式

    2024-07-09 23:48:01       27 阅读
  4. 面向对象设计模式准则

    2024-07-09 23:48:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 23:48:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 23:48:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 23:48:01       58 阅读
  4. Python语言-面向对象

    2024-07-09 23:48:01       69 阅读

热门阅读

  1. 浅谈贝叶斯定理

    2024-07-09 23:48:01       22 阅读
  2. ClickHouse中PRIMARY KEY和ORDER BY关键字的关系

    2024-07-09 23:48:01       21 阅读
  3. 基于Go 1.19的站点模板爬虫

    2024-07-09 23:48:01       24 阅读
  4. C++中的进程和线程的通信交互

    2024-07-09 23:48:01       24 阅读
  5. 如何保证Kafka顺序消费

    2024-07-09 23:48:01       22 阅读
  6. 深入理解Symfony调试工具:从原理到实践

    2024-07-09 23:48:01       26 阅读
  7. 把 .py 文件编译成 .pyd 文件

    2024-07-09 23:48:01       24 阅读
  8. 后端工作之一:CrapApi —— API接口管理系统部署

    2024-07-09 23:48:01       21 阅读
  9. C++ 11 智能指针使用详解

    2024-07-09 23:48:01       17 阅读
  10. Perl 数据类型

    2024-07-09 23:48:01       23 阅读
  11. nvm下载

    nvm下载

    2024-07-09 23:48:01      17 阅读
  12. Python中的格式化输出

    2024-07-09 23:48:01       21 阅读
  13. Ubuntu、CentOs更换源(阿里云的源)

    2024-07-09 23:48:01       21 阅读