工厂模式的三种姿态?

news2024/11/14 4:19:10

在这里插入图片描述

在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具,用于创建对象实例的方式,可以帮助我们更好地组织代码和降低耦合性。在本文中,我将为大家详细介绍工厂模式的三种姿态,同时通过举例和代码演示来帮助大家更好地理解。

工厂模式的三种姿态

工厂模式是一种创建型设计模式,用于解决对象的创建过程与客户端代码的解耦。它有三种常见的姿态,分别是简单工厂模式、工厂方法模式和抽象工厂模式。让我们逐个了解这些姿态。

1. 简单工厂模式

简单工厂模式也被称为静态工厂模式,它通过一个工厂类来创建对象实例。客户端通过工厂类的静态方法来获取所需的对象,而不需要直接实例化对象。

class Product:
    def operation(self):
        pass

class ConcreteProductA(Product):
    def operation(self):
        return "ConcreteProductA operation"

class ConcreteProductB(Product):
    def operation(self):
        return "ConcreteProductB operation"

class SimpleFactory:
    def create_product(self, product_type):
        if product_type == "A":
            return ConcreteProductA()
        elif product_type == "B":
            return ConcreteProductB()

# 在客户端使用
factory = SimpleFactory()
product_a = factory.create_product("A")
print(product_a.operation())  # 输出:ConcreteProductA operation

2. 工厂方法模式

工厂方法模式定义了一个用于创建对象的抽象方法,让子类决定实际创建的对象类型。每个具体的产品都有对应的工厂,从而实现了对象创建与使用的解耦。

class Creator:
    def factory_method(self):
        pass

class ConcreteCreatorA(Creator):
    def factory_method(self):
        return ConcreteProductA()

class ConcreteCreatorB(Creator):
    def factory_method(self):
        return ConcreteProductB()

# 在客户端使用
creator_a = ConcreteCreatorA()
product_a = creator_a.factory_method()
print(product_a.operation())  # 输出:ConcreteProductA operation

3. 抽象工厂模式

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。通过抽象工厂,客户端可以创建一组相关的产品,从而实现更高层次的抽象。

class AbstractFactory:
    def create_product_a(self):
        pass

    def create_product_b(self):
        pass

class ConcreteFactory1(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA()

    def create_product_b(self):
        return ConcreteProductB()

class ConcreteFactory2(AbstractFactory):
    def create_product_a(self):
        return AnotherConcreteProductA()

    def create_product_b(self):
        return AnotherConcreteProductB()

# 在客户端使用
factory_1 = ConcreteFactory1()
product_a = factory_1.create_product_a()
print(product_a.operation())  # 输出:ConcreteProductA operation

举例与案例分析

案例:订单处理系统
在这个案例中,我们将使用工厂模式来创建不同类型的订单对象:普通订单和折扣订单。

第一步:定义订单类
首先,我们定义订单的基类和两个子类,分别表示普通订单和折扣订单。每个订单类型都有不同的属性和处理方式。

class Order:
    def process(self):
        pass

class RegularOrder(Order):
    def process(self):
        return "Processing a regular order"

class DiscountOrder(Order):
    def process(self):
        return "Processing a discount order"

第二步:创建订单工厂
接下来,我们创建一个订单工厂,根据订单类型返回相应的订单对象。

class OrderFactory:
    def create_order(self, order_type):
        if order_type == "regular":
            return RegularOrder()
        elif order_type == "discount":
            return DiscountOrder()

第三步:客户端代码
最后,在客户端代码中,您可以使用订单工厂来创建订单对象,并执行相应的处理操作。

factory = OrderFactory()

order_type = "regular"
order = factory.create_order(order_type)
print(order.process())  # 输出:Processing a regular order

order_type = "discount"
order = factory.create_order(order_type)
print(order.process())  # 输出:Processing a discount order

案例分析

在这个案例中,我们使用工厂模式创建了一个订单处理系统。通过订单工厂,我们可以根据订单类型灵活地创建不同种类的订单对象,而无需在客户端代码中直接实例化。
在实际开发中,也可以进一步扩展订单类型,添加更多的订单属性和处理逻辑。工厂模式将帮助您保持代码的整洁性和可读性。

结语

工厂模式作为软件工程中的常见设计模式,为我们创建对象提供了一种灵活且解耦的方式。通过本文的解释、案例分析以及可能的代码演示,相信您已经对工厂模式的三种姿态有了更清晰的理解。如果您还有更多关于工厂模式的疑问,或者想要分享您的实际应用经验,欢迎在评论区留言,感谢您的阅读与支持!

在这里插入图片描述

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

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

相关文章

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network,让es、kibana在同一个网段: docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意IP地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法&#xf…

高效的WMS系统手持盘点方案

WMS系统手持盘点就是指利用WMS系统支持的手持式电子盘点设备进行库存盘点的方式。 具体来说: - 手持盘点设备是一种小型的电子设备,具有移动条形码扫描功能,可以实时与WMS系统联通。 - WMS系统利用手持设备,可以给仓储人员下发具体的盘点任务,例如需要盘点的货位、商品等信息…

mybatis plus 配置自动设置创建时间和创建人id

1.新建 MyMetaObjectHandler package com.ruoyi.framework.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.bean.LocalUser; import com.ruoyi.coupon.domain.CouponUser; import org.apache.ibatis.reflection.MetaObjec…

软件报错msvcr90.dll丢失的解决方法,亲测可以修复

我曾经遇到过一个令人头疼的问题:msvcr90.dll丢失。这个问题导致了我的程序无法正常运行,让我感到非常苦恼。然而,在经过一番努力后,我终于成功地修复了这个问题,这让我感到非常欣慰和满足。 msvcr90.dll丢失的原因可能…

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量,因为如果声明全局变量,那在后面就有可能会修改 在闭包中的…

深入探讨API接口测试:从基础到高级策略

引言:API测试的重要性 在当前的技术趋势中,API(应用程序接口)已经成为连接各种系统和服务的基石。API不仅仅是大型企业的领域,中小型公司和初创公司也越来越依赖API来拓展他们的业务功能和跨系统通信。正因如此&#…

企业数字化转型大数据湖一体化平台项目建设方案PPT

导读:原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发…

(搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

❓剑指 Offer 38. 字符串的排列 难度:中等 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面 不能有重复元素。 示例: 输入:s “abc” 输出:[“abc”,“acb”,“bac”…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础,对 FreeRTOS 中时间片的概念作了解释,并且给出了实现方式,同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中,我们已经知道任务根据不同的优先级被放入就绪列表中不…

符号随机梯度下降算法SIGNSGD

考虑随机优化问题: 符号随机梯度下降(SIGNSGD)算法: 假设基础: 收敛定理: 联邦优化:

[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界🗺️ 优选系列持续更新中💫 一直在等你,你终于来啦💖 绿色代表解释说明 黄色代表重点 红色代表精髓 SpringMVC是一个基于Java的Web框架,它使用了MVC&…

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…

JVM的前世今生之类加载过程

1. 什么是JVM VM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行,即一…

CMake语法复习

前言 此文总结了库的制作和一些CMake常用的一些语法。 一:创建静态库和动态库 静态库的生成和使用 动态库的生成和使用 二:使用CMake来生成Makefile,生成可执行文件 顶层目录下的CMakeLists.txt project(HELLO) add_subdirectory(libhell…

设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出 在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不…

ps打开出现dll文件丢失怎么回事?该如何修复

今天在看到一个ps的相关问题,可能很多同学也遇到过,安装好ps软件之后,打开会提示无法启动此程序。然后会有各种文件的丢失一般都是xxx.dll文件的格式,并提示尝试重新安装该程序,以解决此问题。不但是PS,还有…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

java:数据库连接池

概念 举个例子来说吧,假设我们开了一家餐馆,客人来了,我们就请一个服务员,使用完后再把他开除了,下个客人再来了,我们再请一个,使用完再开除。 这是不是我们现在使用 JDBC 连接数据库的场景&a…