23种Python设计模式之工厂方法模式详解

2023-05-16

💖 作者:大家好,我是阿旭😜
🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁

文章目录

        • 工厂方法模式
        • 具体实现
        • 优点和缺点

工厂方法模式

亦称:虚拟构造函数、Virtual Constructor、Factory Method

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类

包含的角色

  • 1.抽象产品角色
  • 2.具体产品角色
  • 3.抽象工厂角色
  • 4.具体工厂角色

具体实现

如果说我们现在需要做支付的业务,那如何使用工厂方法模式来书写我们的代码呢?

ABCMeta、abstractmethod

from abc import ABCMeta, abstractmethod

在正式开始之前我先来给大家讲一下ABCMeta和abstractmethod,这两个方法来自于Python中的abc模块,该模块提供了在 Python 中定义抽象基类 (ABC) 的组件。

当一个类继承ABCMeta元类时,则证明此类被定义成了一个抽象类。并且当类中的方法添加了abstractmethod装饰器时,则证明此方法是其子类中需要必须实现的方法。

接下来我们来看如何定义这四种角色:
1.抽象产品角色

class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass

在这段代码中我们定义了一个抽象类Payment,并且定义了一个抽象方法pay。当所有的具体产品角色在继承Payment时,必须实现统一的pay方法。

2.具体产品角色

class AliPay(Payment):
    def __init__(self, use_huabei=False):
        self.use_huabei = use_huabei

    def pay(self, money):
        if self.use_huabei:
            print("花呗支付%d元" % money)
        else:
            print("支付宝支付%d元" % money)


class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%d元" % money)

在此段代码中我们定义了两种支付产品分别为AliPayWechatPay,他们都继承了Payment抽象类并重新定义了pay方法。

3.抽象工厂角色

class PaymentFactory(metaclass=ABCMeta):
    @abstractmethod
    def create_payment(self):
        pass

抽象工厂PaymentFactory的作用是用来创建不同类型的支付对象,所以我们在其内部定义了抽象方法create_payment

4.具体工厂角色

class AliFactory(CreatePayment):
    def create_payment(self):
        return AliPay()
        
class HuabeiFactory(CreatePayment):
    def create_payment(self):
        return AliPay(use_huabei=True)
        
class WechatFactory(CreatePayment):
    def create_payment(self):
        return WechatPay()

我们可以通过不同的工厂来创建不同的支付产品。

pf = HuabeiFactory()
p = pf.create_payment()
p.pay(100)

Output:
在这里插入图片描述

优点和缺点

优点:
1.隐藏了对象创建的具体细节。
2.客户端不需要修改代码。

缺点:
1.每增加一个具体产品类,就需要增加一个相应的具体工厂类。

🎉 支持我:点赞👍收藏⭐️留言📝
📣 系列专栏:23种设计模式详解-Python 🍁

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

23种Python设计模式之工厂方法模式详解 的相关文章

随机推荐

  • 域名解析各项记录对应的值

    1 DNS域名解析中添加的各项解析记录 A记录 xff1a 将域名指向一个IPv4地址 xff08 例如 xff1a 100 100 100 100 xff09 xff0c 需要增加A记录 CNAME记录 xff1a 如果将域名指向一个域名
  • 数据结构———队列的顺序实现

    define MaxSize 100 define ElemType int typedef struct ElemType data MaxSize int front rear SeqQueue void InitQueue SeqQu
  • 直接插入排序

    include lt stdio h gt include lt math h gt include lt string h gt include lt stdlib h gt int main void InsertSort int a
  • C++枚举类型enum使用方法(附带可用代码+通俗易懂)

    1 说明 枚举用来表示某类事情的结果 xff1b 例1 xff1a 下棋比赛的三种结果 xff0c 赢 xff0c 和 xff0c 输 xff1b 这里是描述比赛的结果 例2 xff1a 一周7天中的俩种结果 xff0c 工作日和非工作日
  • 关于python+opencv无法打开摄像的问题

    一开始我认为是软件的兼容问题 xff0c 苦苦思考 xff08 按照流程自己去第三方库里乱下一波是绝对不会出现这种无法打开摄像头的奇葩问题 xff09 xff0c 最终参考网上的教程 xff0c 尝试用系统的相机打开 xff0c 看 xff
  • 蓝桥杯每日一题(28)七段码(python)

    Topic 试题 D 七段码 本题总分 xff1a 10 分 问题描述 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 数码管中一共有 7 段可以发光的二极管 xff0c 分别标记为 a b c d e f g
  • 数据结构之顺序表(C语言)

    目录 1 线性表 1 1 线性表的概念 xff1a 1 2 线性表数据的存储方式 xff1a 注意 xff1a 2 顺序表 2 1 概念 2 2 顺序表的存储结构 3 顺序表的各种操作函数实现 3 1 顺序表初始化 3 2 顺序表判满函数
  • Posix与System V共享内存区

    Posix与System V共享内存区 一 Posix共享内存区1 概述2 shm open和shm unlink函数3 ftruncate和fstat函数4 给一个共享的计数器持续加1 例子5 向一个服务器发送消息例子 二 System
  • ARM裸机开发——Linux环境搭建和LED灯闪烁实验

    写在前面 本文为学校开展的嵌入式系统设计课程 xff0c 本文主要是记录课程中的相关作业与学习记录 xff0c 本课程采用了S3C2440A嵌入式系统开发板 xff0c 由于主要以学校开展课程为主 xff0c 本文内容可能有一定的课程资料辅
  • Linux文件系统常用命令

    文件系统常见目录 boot 包含系统内核 xff0c 系统启动时加载到内存 etc 含系统配置文件 var 含系统中变化信息 xff08 如日志 xff09 的目录 dev 可直接对物理设备存取的特殊文件 bin
  • PTA_Python3_企业根据利润提成发放奖金问题

    企业根据利润提成发放奖金问题 利润低于或等于10万元时 xff0c 奖金可提10 xff1b 利润高于10万元 xff0c 低于20万元时 xff0c 低于10万元的部分按10 提成 xff0c 高于10万元的部分 xff0c 可提成7 5
  • 【4大运营商光猫默认初始超级密码】

    4大运营商光猫默认初始超级密码 xff1a 1 电信超级密码 telecomadmin nE7jA 5m 2 移动超级密码 CMCCAdmin aDm8H MdA 3 联通超级密码 CUAdmin CUAdmin 4 广电超级密码 admi
  • 写delete时遇到的问题

    在写delete的时候会跳出错误 ConsoleApplication1 exe Win32 已加载 C Windows SysWOW64 ntdll dll 无法查找或打开 PDB 文件 ConsoleApplication1 exe W
  • 宏定义可以自增自减吗?(带题讲解,并总结C语言数据类型可自加自减的)

    不可以 通过实验我们可以得出double型数据可以自加 xff0c 且每次变化为1 在宏定义下自加出现了错误 xff0c 如下 xff1a 总结int char double float 都可进行自加自减运算
  • Linux下将当前目录下的某个文件复制到指定文件夹

    cp filename home directory 即cp 文件名 目标文件夹的绝对路径 批量复制 cp filename1 filename2 filename3 home directory 即cp 文件1名 文件2名 文件3名 目标
  • centos的命令行个性化配置

    centos的命令行个性化配置 cd root 进入配置文件 vim bashrc 在末行输入 PS1 61 34 debian chroot 43 debian chroot e 32 1m u e 0m 64 h e 34 1m w e
  • 数据库作业:数据查询 连接查询

    若一个查询同时涉及两个以上的表 xff0c 称之为连接查询 连接查询是数据库中最主要的查询 xff0c 包括等值连接查询 xff0c 自然连接查询 xff0c 自身连接查询等 一 等值和非等值连接查询 1 1连接查询的WHERE子句中用来连
  • Ubuntu20.04安装arm-linux-gcc

    我安装的版本是arm linux gcc 4 6 4 xff0c 并且是64位的 在windows系统中把arm linux gcc 4 6 4 arm x86 64 tar bz2压缩包放在跟Ubuntu虚拟机的共享目录下在Ubuntu2
  • OSI七层模型总结

    OSI Open System Inter Connection 开放系统互联模型 定义了不同计算机互联的标准 xff0c 设计和描述了计算机网络通信的框架 OSI有7层和5层两种模型 xff0c 7层模型从上往下分别是 xff1a 应用层
  • 23种Python设计模式之工厂方法模式详解

    x1f496 作者 xff1a 大家好 xff0c 我是阿旭 x1f61c x1f389 支持我 xff1a 点赞 x1f44d 收藏 留言 x1f4dd x1f4e3 系列专栏 xff1a 23种设计模式详解 Python x1f341