当前位置: 首页 > news >正文

【从零开始学习计算机科学】设计模式(二)工厂模式、抽象工厂模式、单例模式、建造者模型、原型模式

【从零开始学习计算机科学】设计模式(二)工厂模式、抽象工厂模式、单例模式、建造者模型、原型模式

    • 工厂模式
      • 主要特点
      • 类型
      • 适用场景
    • 抽象工厂模式
      • 主要特点
      • 工作原理
      • 适用场景
      • 举例
      • 优点
      • 缺点
      • 总结
    • 单例模式
      • 主要特点
      • 工作原理
      • 适用场景
      • 优点
      • 缺点
      • 总结
    • 建造者模式
      • 主要特点
      • 工作原理
      • 适用场景
      • 优点
      • 缺点
      • 总结
    • 原型模式
      • 主要特点
      • 工作原理
      • 适用场景
      • 优点
      • 缺点
      • 总结

工厂模式

工厂模式(Factory Pattern)是一种常用的创建型设计模式,目的是通过工厂方法来创建对象,而不是直接在客户端代码中实例化对象。工厂模式将对象的创建与使用分离,使得客户端无需了解创建对象的具体过程,从而减少了系统之间的耦合。

主要特点

  • 封装对象创建:客户端不直接创建对象,而是通过工厂类来生成对象。
  • 解耦:客户端只关心需要什么类型的对象,而不需要知道具体的创建过程或对象的实现细节。

类型

  • 简单工厂模式:由一个工厂类决定实例化哪个产品。
  • 工厂方法模式:每个子类负责实例化具体的产品,工厂方法将创建工作委托给具体的子类。
  • 抽象工厂模式:提供一个接口用于创建一系列相关或相互依赖的产品,而不需要指定具体类。

适用场景

  • 当系统不想或不能依赖于产品的具体实现时。
  • 客户端只关心产品类型,而不关心具体如何创建时。
  • 产品类的创建逻辑复杂,需要封装的情况。

抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。换句话说,抽象工厂模式允许客户端通过一个工厂接口来创建多个产品,而不需要知道具体的产品类。

主要特点

  • 产品族:抽象工厂模式关注创建一组相关的产品。每个具体工厂可以生产一系列相关的产品。
  • 解耦产品创建:客户端通过工厂接口来获取不同类型的产品,而不关心这些产品的具体实现。

工作原理

  • 定义一个抽象工厂接口,声明一组方法用于创建产品。
  • 为每一组相关的产品创建一个具体工厂类来实现这个接口。
  • 产品由多个接口定义,每个产品系列都会有一个对应的具体产品类。

适用场景

  • 当需要创建多个相关对象,并且系统不希望依赖于具体的类时。
  • 当产品族(系列)较多,并且产品间有相互依赖时,抽象工厂模式可以很好的组织和管理这些对象的创建。
  • 当系统需要切换不同的产品族时,抽象工厂可以提供一个统一的接口。

举例

如果一个系统需要支持多种主题(如深色、浅色主题),每种主题可能包含不同类型的按钮、菜单、对话框等。使用抽象工厂模式,可以为每种主题创建一组相关的界面组件,而客户端通过工厂接口获取这些组件,而无需知道具体实现。

优点

  • 客户端与具体类解耦,灵活性较强。
  • 易于

相关文章:

  • 一级运动员最小几岁·棒球1号位
  • ThinkPad T480s更换开机BIOS图片的详细步骤
  • KNN算法原理及python代码实现
  • PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码
  • RabbitMQ可靠性进制
  • C语言每日一练——day_9
  • 【AHE数据集】 NCAR Anthropogenic Heat Flux (AHF) 数据集
  • Flask应用调试模式下外网访问的技巧
  • Day5 结构体、文字显示与GDT/IDT初始化
  • MySQL查询语句之like
  • Flask从入门到精通--初始Flask
  • 黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)
  • 五种最新优化算法(ALA、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
  • dubbo nacos配置详解
  • 【electron】vue项目中使用electron打包报错的解决办法
  • 用pyqt做个日期输入控件,实现公农历转换及干支纪时功能
  • python微分方程求解,分别用显式欧拉方法、梯形法、改进欧拉方法、二阶龙格库塔方法、四阶龙格库塔方法求解微分方程
  • [oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
  • 解决WIN10使用苹果鼠标滚轮不能使用的问题
  • ArcGis使用-对轨迹起点终点的网格化编号
  • 打造全域消费场景,上海大世界百个演艺娱乐新物种待孵化
  • 涨价应对关税变化是短期之策,跨境电商塑造新品牌开辟“新蓝海”
  • 敲定!今年将制定金融法、金融稳定法
  • 特朗普说克里米亚将留在俄罗斯,泽连斯基:绝不承认
  • 中青报:“猿辅导员工猝死”事件上热搜,是对健康职场环境的共同关切
  • 四川:全省统一取消普通住宅和非普通住宅标准