当前位置: 首页 > 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.lryc.cn/news/617124.html

相关文章:

  • 电子电气架构 --- 软件定义汽车的驱动和挑战
  • 飞算JavaAI vs 传统开发:效率与质量的双重突破
  • 【MySQL✨】服务器安装 MySQL 及配置相关操作
  • Orange的运维学习日记--38.MariaDB详解与服务部署
  • B站直播, 拼接4个窗口,能否实现
  • Deepoc如何让传统码垛机器人获得“类人决策力“​
  • 服务器配置实战:从 “密码锁” 到 “分工协作” 的知识点详解
  • docter的使用、vscode(cursor)和docker的连接,详细分析说明
  • Django Request 与 DRF Request 的区别
  • 低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?
  • 智能双行框!百度全量上线AI搜索,是革新浪潮还是昙花一现?
  • ECCV 2024 论文解读丨具身智能、机器人研究最新突破创先点分享合集
  • SQL刷题
  • 使用行为树控制机器人(三) ——通用端口
  • 想冲华为AI认证,怎么选方向?
  • 疯狂星期四文案网第36天运营日记
  • 【Docker-Day 13】超越默认Bridge:精通Docker Host、None与自定义网络模式
  • IDE认知革命:JetBrains AI Assistant插件深度调教手册(终极实战指南)
  • 随身WiFi技术军备赛白热化:WiFi6架构下放中端市场,格行中兴华为三足鼎立;从芯片到场景的 10 款标杆产品深度解析
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • 面试题-----微服务业务
  • 【PRML】分类
  • VSCode编辑器常用24款基础插件
  • HRM分层推理模型在医疗AI上的应用探析
  • word的正则替换
  • FlinkSql(详细讲解二)
  • 时序数据库选型指南:Apache IoTDB为何成为工业物联网首选?
  • Apache IoTDB 全场景部署:基于 Apache IoTDB 的跨「端-边-云」的时序数据库 DB+AI
  • “底层闭源 + Lua 脚本” 开发模式
  • 鸿蒙Des 加密解密 C++版本