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

python面向对象设计模式

设计模式

工厂方法

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中

优点:

  1. 用户只要知道具体的工厂名称就可以得到所要的产品,无需知道产品的具体创建过程

  2. 在系统增加新的产品时 只需要添加具体产品类和对应的具体工厂类 无需对原工厂进行任何修改 满足开闭原则

缺点

​ 每增加一个产品都要增加一个具体产品和对应工厂类 增加了系统复杂度

适用场景

  1. 客户只知道创建产品的工厂名 而不知道具体的产品名称
  2. 创建对象任务由多个具体子工厂中的某一个完成
  3. 客户不关心创建产品的细节 只关心产品的品牌
from abc import abstractmethod, ABC
# 工厂方法实现
class Product:"""抽象产品:定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass Hat(Product):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 同具体工厂之间一一对应帽子->帽子工厂"""def show(self):print("我是一个帽子!!!")class Scarf(Product):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 同具体工厂之间一一对应围巾->围巾工厂"""def show(self):print("我是一个围巾!!!")class AbstractFactory:"""抽象工厂: 提供创建产品的接口"""@abstractmethoddef new_product(self):passclass HatFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product(self):return Hat()class ScarfFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product(self):return Scarf()if __name__ == '__main__':HatFactory().new_product().show()ScarfFactory().new_product().show()

抽象工厂方法

抽象工厂模式:

​ 是一种为访问类提供一个创建一组相关或相互依赖对象的接口
​ 访问类无需指定所要产品的具体类就能得到同族不同等级的产品的模式结构

抽象工厂模式需要满足的条件:

   1. 系统中有多个产品族(如品牌) 每个具体工厂创建同一族但属于不同等级(如不同产品类型)机构的产品2. 系统一次只可能消费其中某一组的产品

优点:

   1. 工厂模式优点2. 可以在类的内部对产品族中相关联的多等级产品共同管理 而不必专门引入多个新类来进行管理3. 增加一个新的产品族时 不需要修改原代码 满足开闭原则

缺点:

​ 当产品族这种需要增加一个新的产品时 所有的工厂类都要进行修改

模式应用场景

  1. 需要创建的对象是一系列相互关联或相互依赖的产品族时
  2. 系统中有多个产品族 但每一次只使用其中某一族的产品
  3. 系统中提供了产品的类库 并且所有产品的接口相同 客户端不依赖产品实例的创建细节和内部结构
from abc import abstractmethod
class Hat:"""抽象产品:  抽象产品:定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass Scarf:"""抽象产品: 定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass AdidasHat(Hat):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个阿迪达斯帽子")class AdidasScarf(Scarf):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个阿迪达斯围巾")class ErkeHat(Hat):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个鸿星尔克帽子")class ErkeScarf(Scarf):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个鸿星尔克围巾")class AbstractFactory:"""抽象工厂: 提供创建产品的接口 具有多个创建产品的方法"""@abstractmethoddef new_product_hat(self):pass@abstractmethoddef new_product_scarf(self):passclass AdidasFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product_hat(self):return AdidasHat()def new_product_scarf(self):return AdidasScarf()class ErkeFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product_hat(self):return ErkeHat()def new_product_scarf(self):return ErkeScarf()if __name__ == '__main__':AdidasFactory().new_product_hat().show()AdidasFactory().new_product_scarf().show()ErkeFactory().new_product_hat().show()ErkeFactory().new_product_scarf().show()
http://www.xdnf.cn/news/1283239.html

相关文章:

  • Linux DNS服务解析原理与搭建
  • OrbStack 入门教程:macOS 上的轻量级容器与虚拟机管理工具
  • C#高级语法_泛型
  • Vue 中的 Class 与 Style 绑定详解2
  • 基于 Spring Boot 的登录功能实现详解
  • 企业高性能 Web 服务部署实践(基于 RHEL 9)
  • sqli-labs通关笔记-第42关 POST字符型堆叠注入(单引号闭合 手工注入+脚本注入两种方法)
  • Rust学习笔记(一)|Rust初体验 猜数游戏
  • 从 GPT-2 到 gpt-oss:架构进步分析
  • 【lucene】文档id docid
  • 算法基础 1
  • 基于飞算JavaAI的日志监测系统开发实践:从智能生成到全链路落地
  • Spring-Security-5.7.11升级6.5.2
  • 机器学习-决策树(DecisionTree)
  • YOLOv6深度解析:实时目标检测的新突破
  • GESP2023年9月认证C++一级( 第三部分编程题(1)买文具)
  • vue3-pinia
  • 在 Ubuntu 中docker容器化操作来使用新建的 glibc-2.32
  • SQL 基础查询语句详解
  • Pytest项目_day12(yield、fixture的优先顺序)
  • 论文学习22:UNETR: Transformers for 3D Medical Image Segmentation
  • MFC C++ 使用ODBC方式调用Oracle数据库的详细步骤
  • 北京朝阳区中小学生信息学竞赛选拔赛C++真题
  • 电子电气架构 --- 软件定义汽车的驱动和挑战
  • [Element-plus]动态设置组件的语言
  • Oracle数据库中的Library cache lock和pin介绍
  • Redis 数据结构及特点
  • VMD例程(Matlab 2021b可直接使用)
  • C++方向知识汇总(三)
  • 【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键