工厂模式:没你想像的那么难

工厂模式

工厂模式是一种创建型设计模式,它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成,从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性,减少了代码中的重复和耦合。

在工厂模式中通常会包含以下几个要素:

  • 产品接口(Product Interface):定义了要创建的对象的通用接口。
  • 具体产品(Concrete Product):实现了产品接口的具体对象。
  • 工厂接口(Factory Interface):定义了一个创建对象的方法,通常是一个接口或者抽象类。
  • 具体工厂(Concrete Factory):实现了工厂接口,负责创建具体产品的对象。

现在,让我们通过一个 Python 示例来说明工厂模式的用法。假设我们有一个简单的图形绘制应用,它可以绘制圆形和矩形。我们将使用工厂模式来创建这些形状对象。

# 产品接口:形状
class Shape:def draw(self):pass# 具体产品:圆形
class Circle(Shape):def draw(self):print("Inside Circle::draw() method.")# 具体产品:矩形
class Rectangle(Shape):def draw(self):print("Inside Rectangle::draw() method.")# 工厂接口
class ShapeFactory:def create_shape(self, shape_type):pass# 具体工厂:形状工厂
class SimpleShapeFactory(ShapeFactory):def create_shape(self, shape_type):if shape_type.lower() == "circle":return Circle()elif shape_type.lower() == "rectangle":return Rectangle()else:raise ValueError("Unsupported shape type: " + shape_type)# 客户端代码
if __name__ == "__main__":# 创建形状工厂对象shape_factory = SimpleShapeFactory()# 根据工厂创建形状对象circle = shape_factory.create_shape("circle")circle.draw()rectangle = shape_factory.create_shape("rectangle")rectangle.draw()

在这个示例中,我们定义了 Shape 接口作为产品接口,然后实现了具体的产品类 Circle 和 Rectangle。接着,我们定义了一个工厂接口 ShapeFactory 和一个具体工厂类 SimpleShapeFactory,后者实现了创建形状对象的方法 create_shape。最后,在客户端代码中,我们使用工厂对象来创建具体的形状对象,而无需直接实例化具体的产品类。

这种设计使得客户端代码与具体的产品类解耦,使得在需要添加新的产品类型时,只需要修改工厂类而无需修改客户端代码,从而提高了代码的可维护性和可扩展性。

抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的方法,而无需指定其具体类。该模式通过引入抽象工厂和具体工厂来实现,从而使得客户端代码与具体产品类的实现相互独立。

抽象工厂模式通常涉及以下几个关键组件:

  • 抽象工厂(Abstract Factory):定义了一组方法,用于创建一系列相关或依赖对象的抽象接口。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,并负责创建具体产品族的对象。
  • 抽象产品(Abstract Product):定义了一组相关或依赖对象的抽象接口。
  • 具体产品(Concrete Product):实现了抽象产品接口的具体对象。

抽象工厂模式与工厂模式相比,其可以创建一组相关的对象,而不仅仅是单个对象。

下面是一个简单的 Python 示例,演示了抽象工厂模式的应用。假设我们有一个图形界面库,它包含按钮和文本框两种组件,我们可以根据不同的操作系统(例如 Windows 和 macOS)创建对应的按钮和文本框。

# 抽象产品:按钮接口
class Button:def paint(self):pass# 具体产品:Windows 按钮
class WindowsButton(Button):def paint(self):print("Rendering a Windows style button.")# 具体产品:macOS 按钮
class MacOSButton(Button):def paint(self):print("Rendering a macOS style button.")# 抽象产品:文本框接口
class TextBox:def paint(self):pass# 具体产品:Windows 文本框
class WindowsTextBox(TextBox):def paint(self):print("Rendering a Windows style text box.")# 具体产品:macOS 文本框
class MacOSTextBox(TextBox):def paint(self):print("Rendering a macOS style text box.")# 抽象工厂:UI 工厂接口
class UIFactory:def create_button(self):passdef create_text_box(self):pass# 具体工厂:Windows UI 工厂
class WindowsUIFactory(UIFactory):def create_button(self):return WindowsButton()def create_text_box(self):return WindowsTextBox()# 具体工厂:macOS UI 工厂
class MacOSUIFactory(UIFactory):def create_button(self):return MacOSButton()def create_text_box(self):return MacOSTextBox()# 客户端代码
if __name__ == "__main__":# 根据当前操作系统选择对应的 UI 工厂os = "windows"  # 可以根据实际情况修改if os.lower() == "windows":ui_factory = WindowsUIFactory()elif os.lower() == "macos":ui_factory = MacOSUIFactory()else:raise ValueError("Unsupported operating system: " + os)# 使用 UI 工厂创建按钮和文本框button = ui_factory.create_button()text_box = ui_factory.create_text_box()# 渲染按钮和文本框button.paint()text_box.paint()

在这个示例中,我们定义了抽象产品接口 Button 和 TextBox,以及两种具体产品类(Windows 和 macOS 版本)。然后,我们定义了抽象工厂接口 UIFactory 和两个具体工厂类(WindowsUIFactory 和 MacOSUIFactory),分别用于创建 Windows 和 macOS 版本的按钮和文本框。最后,在客户端代码中,我们根据当前操作系统选择对应的工厂,并使用工厂创建按钮和文本框,然后调用它们的渲染方法。

 查看原文:工厂模式:没你想像的那么难

关注公众号 "字节航海家" 及时获取最新内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年下半年教师资格证考试《高中信息技术》题

4.使用某转码软件对一段时长为2分钟的AVI视频进行转码,转码后的视频信息如图4所示,计算存储该视频文件所需的空间大小为(C )。 A18MB B36MB C60MB D512MB 6.某21位二进制代码100101011010011110101,已知该代码由3个…

html基础操练和进阶修炼宝典

文章目录 1.超链接标签2.跳锚点3.图片标签4.表格5.表格的方向属性6.子窗口7.音视频标签8.表单9.文件上传10.input属性 html修炼必经之路—各种类型标签详解加展示&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 1.超链接标签 <!DOCTYPE html> <html lang"en…

再议【每天进步一点点】

概述 之前听姜胡说&#xff0c;讲到了他自己日更博客的故事&#xff0c;也就是每天去更新一篇博客文章。 日更&#xff0c;其实是一件很可怕的事情。 先不说文章的深度如何&#xff0c;单单从时间的耗费上&#xff0c;文字的积累上&#xff0c;以及对事物的敏感度上&#xf…

vue实现自定义树形穿梭框功能

需求&#xff1a; 我们在开发过程中&#xff0c;会遇到需要将一个数据选择做成穿梭框&#xff0c;但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示&#xff0c;ElementUI自身无法在穿梭框中添加树形结构&#xff0c;网上搜到了大佬封装的插件但是对于右侧的无树形结…

【从Python基础到深度学习】9.Python 语法基础

一、常量与变量 常量:程序中使用的具体的数、字符。在运行过程中&#xff0c;值无法更改 变量:表示一一个存储单元&#xff0c;其中存储的值可以修改 如&#xff1a;a5,b6 变量命名: 1、只能包含字母、数字、下划线 2、只能以字母、下划线开头 3、不要使用关键字作为变量名称 …

不知道伦敦银模拟账户该如何使用?至少3个用法

由于模拟交易的特别属性&#xff0c;很多人对模拟交易并不用心&#xff0c;假的资金用心干什么&#xff1f;就算交易得再好&#xff0c;盈利得再多&#xff0c;假的资金会变成真的吗&#xff1f;因此当然不会这么用心对待伦敦银模拟账户交易账户。实际上&#xff0c;这种观点是…

List集合的Stream流式操作实现数据类型转换

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、Collectors.toList() 2、Collectors.toCollection(ArrayList::new) 3、Collectors.toCollection(LinkedList::new) 4、Collectors.toCollection(LinkedHashSet::new) 5、Collector…

MAC M1 安装mongodb7.0.5 版本

1、进入官网 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、选择版本 3、下载后解压 放到 /usr/local 并修改…

Facebook Messenger链接分享:如何创建链接并设置自动化内容

Facebook Messenger链接是指基于Facebook用户名创建的会话链接&#xff0c;用户可以在其Facebook页面的设置部分复制此链接进行分享。然后将该链接直接粘贴到独立站、电子邮件、名片或社交媒体中&#xff0c;让目标受众可以一键进入对话。为了满足某些商家的需求&#xff0c;Fa…

vue3中的ref和reactive的区别

vue3中的ref和reactive的区别 1、响应式数据2、ref3、reactive4、ref VS reactive5、往期回顾总结&#xff1a; 1、响应式数据 处理响应式数据时到底是该用ref还是reactive... 响应式数据是指在 Vue.js 中&#xff0c;当数据发生变化时&#xff0c;相关的视图会自动更新以反映…

【bash】2、手把手实现一个 bash shell:多个机器批量执行 shell 命令,支持 ip 补全

文章目录 一、需求&#xff1a;多台机器批量远程执行 shell 命令1.1 业务需求拆解为脚本需求1.2 帮助函数&#xff1a;使用说明文档1.3 main 函数框架 二、功能&#xff1a;单机 sshp 执行2.1 fullip 函数&#xff1a;实现 ip 补全2.1.1 参数说明2.1.2 定义全局变量2.1.3 实现&…

Pytorch 复习总结 4

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 深度学习计算。 本文先介绍了深度学习中自定义层和块的方法&#xff0c;然后介绍了一些…

基于Beego 1.12.3的简单website实现

参考 用Beego开发web应用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官网 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

微信开发者工具-代码管理和码云Github远程仓库集成

目录 思考&#xff1a;IDE如何进行代码管理 代码管理方式 一、自身提供服务 二、Git 扩展 1、环境准备 2、创建项目代码 3、进行项目Git初始化 4、在码云新建远程仓库 5、将项目进行远程仓库关联 三、SVN扩展 四、代码管理 思考&#xff1a;IDE如何进行代码管理 初识开…

StarRocks实战——贝壳找房数仓实践

目录 前言 一、StarRocks在贝壳的应用现状 1.1 历史的数据分析架构 1.2 OLAP选型 1.2.1 离线场景 1.2.2 实时场景 1.2.3 StarRocks 的引入 二、StarRocks 在贝壳的分析实践 2.1 指标分析 2.2 实时业务 2.3 可视化分析 三、未来规划 3.1 StarRocks集群的稳定性 3…

PMP考试培训费用多少钱?

PMP考试的相关费用包括报名费用、培训费用和证书续证费用三个部分。 一、PMP考试报名费用&#xff1a; 首次报考费用为3900元&#xff0c;如果未通过考试可以在英文报名有效期内进行补考报名&#xff0c;补考费用为2500元。 付费方式是在项目管理学会官方网站上提交报考资料…

企业数字化转型的第一步:由被动多云向主动多云转变

随着经济环境、市场形势、技术发展、用户需求等诸多因素的变化&#xff0c;数字化转型为企业进一步提升效率和竞争力、提供更加丰富的个性化产品和服务、进行业务场景创新、探寻新的增长机会和运营模式提供了崭新的途径。越来越多的企业意识到&#xff0c;数字化转型已不是企业…

第1篇 Linux Docker安装rabbitmq

Docker安装RabbitMq 1、搜索rabbitmq镜像 docker search rabbitmq2、下载rabbitmq镜像 docker pull rabbitmq3、运行rabbitmq服务 docker run -d --name rabbitmq --restart always -p 15672:15672 -p 5672:5672 rabbitmq4、访问rabbitmq http://192.168.1.x:15672 5、rab…

亚信安慧AntDB:打破数据孤岛,实现实时处理

AntDB数据库以其独特的创新能力在分布式数据库领域引领潮流。其中&#xff0c;融合统一与实时处理是其两大核心创新能力&#xff0c;为其赢得广泛关注与赞誉。融合统一意味着AntDB能够将多种不同类型的数据库融合为一体&#xff0c;实现数据的统一管理与处理&#xff0c;极大地…