1-python工厂模式

2023-05-16

文章目录

      • 工厂模式定义:
      • 它的优点:
      • 可以有如下三种实现方式
        • 1.简单工厂模式
        • 2.工厂方法模式
        • 3.抽象工厂模式
        • 总结

工厂模式定义:

在面向对象编程中,术语“工厂”表示一个负责创建替他类型对象的类。通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法。
客户端使用某些参数调用此方法,之后,工厂会据此创建所需类型的对象,然后将它们返回给客户端。

它的优点:

  • 松耦合,对象的创建独立于类的实现
  • 客户端无需了解创建对象的类,只需知道需要传递的接口,方法和参数就能够创建所需要的对象
  • 很容易扩展工厂添加其他类型对象的创建,而使用者只需要改变参数就可以了

可以有如下三种实现方式

1.简单工厂模式

先建立一个可乐抽象类,再建立两个子类可口可乐和百事可乐实现类,再建立一个工厂类来获取需要的类

示例代码如下:

from abc import ABCMeta, abstractmethod

"""
建立一个可乐的抽象类,百事可乐和可口可乐继承这个抽象类
ABCMeta是python的一个元类,用于在Python程序中创建抽象基类,抽象基类中声明的抽象方法,使用abstractmethod装饰器装饰。
"""
class Coke(metaclass=ABCMeta):

    @abstractmethod
    def drink(self):
        pass

class Kekou(Coke):
    def drink(self):
        print('喝可口可乐')


class Baishi(Coke):
    def drink(self):
        print('喝百事可乐')

"""
建立快餐店类,也就是所说的工厂类,让它生产可乐。
当用户需要可乐时,只需要告诉快餐店做一份什么品牌的可乐,告诉快餐店可乐的名字,然后快餐店使用make_coke方法做可乐,返回了你所需要的对象
拿到可口可乐的对象,就可以调用自己实现的方法了。
"""
class Fast_food_restaurant:
    def make_coke(self, name):
        # eval(类名)返回的是一个class类型的对象
        return eval(name)()

kfc = Fast_food_restaurant()
coke = kfc.make_coke('Kekou')
coke.drink()

2.工厂方法模式

以上功能的实现得益于eval函数的使用,如果不用这个函数该如何实现呢?

可以将原来的工厂类变成抽象类,不同类型的可乐通过不同的子类生产,也就是工厂方法模式定义了一个创建对象的接口,
但具体创建哪个类的对象由子类来决定,这种方式的逻辑判断相当于交给了客户端,这样如果有新可乐产品出现的话,只需要再写一个子类继承工厂抽象类。

示例代码如下:

from abc import ABCMeta, abstractmethod

class Coke(metaclass=ABCMeta):
    # 这里是一个抽象的产品类
    @abstractmethod
    def drink(self):
        pass

class Kekou(Coke):
    # 具体产品类
    def drink(self):
        print('喝可口可乐')

class Baishi(Coke):
    # 具体产品类
    def drink(self):
        print('喝百事可乐')

"""
这里变成抽象工厂类:
"""

class Fast_food_restaurant(metaclass=ABCMeta):

    @abstractmethod
    def make_coke(self):
        # eval(类名)返回的是一个class类型的对象
        # return eval(name)()
        # 如果这里不用eval这个方法,该如何实现呢,这里工厂类也是一个抽象类,再创建不同可乐厂商的实现类即可
        pass

"""
具体工厂类-可口可乐
"""

class kekou_produce(Fast_food_restaurant):
    def make_coke(self):
        return Kekou()

"""
具体工厂类-百事可乐
"""

class baishi_produce(Fast_food_restaurant):
    def make_coke(self):
        return Baishi()

kfc = kekou_produce()
coke = kfc.make_coke()
coke.drink()

3.抽象工厂模式

抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象而无需指定具体的类。这个模式与与工厂方法模式的区别在于,它的一个方法子类,可以创建一系列的对象。

如果可乐又分为冰可乐和普通可乐,于是我们的抽象产品类变为了两个,一个是冰可乐,一个是普通可乐,
具体产品类有百事冰可乐、可口可乐冰可乐,普通百事,普通可口可乐。
抽象工厂类有生产冰可乐和生产普通可乐的抽象方法,具体工厂类有百事工厂,可口可乐工厂

from abc import ABCMeta, abstractmethod

class Ice_Coke(metaclass=ABCMeta):
    # 这里是一个抽象的产品类
    @abstractmethod
    def drink(self):
        pass

class Oridinary_Coke(metaclass=ABCMeta):
    # 这里是一个抽象的产品类
    @abstractmethod
    def drink(self):
        pass

class kekou_Ice(Ice_Coke):
    # 具体产品类
    def drink(self):
        print('喝可口冰可乐')

class kekou_Ori(Oridinary_Coke):
    # 具体产品类
    def drink(self):
        print('喝可口普通可乐')

class Baishi_Ice(Ice_Coke):
    # 具体产品类
    def drink(self):
        print('喝百事冰可乐')

class Baishi_Ori(Oridinary_Coke):
    # 具体产品类
    def drink(self):
        print('喝百事普通可乐')

class Fast_food_restaurant(metaclass=ABCMeta):

    @abstractmethod
    def make_ice_coke(self):
        pass

    @abstractmethod
    def make_ori_coke(self):
        pass

"""
具体工厂类-可口可乐
"""

class kekou_produce(Fast_food_restaurant):
    def make_ice_coke(self):
        return kekou_Ice()

    def make_ori_coke(self):
        return kekou_Ori()

"""
具体工厂类-百事可乐
"""

class baishi_produce(Fast_food_restaurant):
    def make_ori_coke(self):
        return Oridinary_Coke()

    def make_ice_coke(self):
        return Ice_Coke()


kfc = kekou_produce()
coke = kfc.make_ice_coke()
coke.drink()
coke = kfc.make_ori_coke()
coke.drink()

总结

工厂模式在实际的应用场景举例:

假如有一个消息通知的功能,需要实现根据不同的消息内容发送到邮件、微信等渠道。我们就可以利用工厂模式来进行解耦,以后如果新增了短信等其他通知方式,就可以轻松应对,对原有代码侵入较低,可以方便的进行扩展功能。

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

1-python工厂模式 的相关文章

随机推荐

  • 编写驱动,应用层程序,在应用层通过ioctl控制LED灯流水,当按键KEY1按下,让风扇转动

    需求 xff1a 编写驱动 xff0c 应用层程序 xff0c 在应用层通过ioctl控制LED灯流水 xff0c 当按键KEY1按下 xff0c 让风扇转动 实现过程 xff1a 在源码目录下arch arm boot dts stm32
  • 使用platform框架实现led流水灯和按键中断开启风扇

    需求 xff1a 使用platform框架实现led流水灯和按键中断开启风扇 实现过程 xff1a 设备树文件 xff1a dts v1 include 34 stm32mp157 dtsi 34 include 34 stm32mp15x
  • Centos7安装Redis

    今天和大家分享如何在Centos7上部署Redis数据库 xff0c 感兴趣的小伙伴可收藏 目录 一 准备工作 二 搭建服务器 三 部署Redis 3 1 远程登录我们的服务器 3 2 配置Redis 3 3 测试Redis 3 4 服务器
  • 详细介绍云服务器购买并使用

    由于原先的服务器块过期了 xff0c 所以今天和大家分享一下如何从头开始购买云服务器并使用 目录 一 详细步骤 1 选择服务器 xff1a 2 购买服务器 xff1a 3 配置服务器操作系统 4 进入控制台 5 管理服务器 6 登录系统实例
  • SDN初学者之路

    今天重新开始拿起SDN完成我的关于SDN控制器下关于交换机迁移的负载均衡问题研究 以此对于SDN 43 RYU 43 多控制器 43 交换机迁移 43 负载均衡相关进行整理记录 其中 xff0c 主要研究内容是交换机迁移过程中的路径最优化选
  • 腾讯云短信服务(详细教程-Django框架、API接口)实现

    今天和大家分享如何实现短信服务 xff0c 以腾讯云服务为例 目录 一 准备工作 二 短信服务接口开发 2 1 服务配置 2 2接口开发 三 测试短信服务 四 结束语 一 准备工作 腾讯云短信服务会发放免费的个人认证短信和赠送短信总共200
  • Pytest测试框架基础篇

    今天和大家分享一下pytest测试框架的基础篇 xff0c 内容包括 xff1a 了解pytest测试框架的特点 掌握pytest基本使用 掌握pytest常用的场景 掌握pytest运行参数和配置方法 目录 一 测试框架的作用和类型 1
  • Pytest测试框架进阶篇

    今天和大家分享pytest测试框架进阶篇 xff0c 也可以称之为pytest测试框架核心 xff0c 主要核心有 xff1a 掌握pytest fixture 掌握pytest mark 目录 一 掌握pytest fixture 1 1
  • PowerDesigner--快速创建表模型生成SQL语句

    今天和大家分享一个我常用的设计表模型的工具PowserDesigner 选择物理模型 创建表 字段 索引等 梳理表之间的关系 一键生成SQL语句 目录 一 准备工作 二 选择物理模型 三 创建表 字段等 3 1 创建表 3 2 创建字段 3
  • python读取txt文件内容并进行分析

    今天和大家分享一下python如何读取txt文件内容并进行数据分析的 需求 某txt文件中存在很多数据 这些数据的某一个属性主要分为A B C D四类 xff0c 要求把数据分成四类求某一数值属性的平均值 xff0c 并统计生成超过平均值两
  • python脚本控制服务器---paramiko的使用

    今天和大家分享一个第三方库paramiko xff0c 主要应用场景是在实现自动化操作服务器时使用 xff0c 模拟我们手动登录服务器 输入cmd命令等操作 最后封装成自己的工具 xff0c 方便后面调用 目录 一 安装paramiko 二
  • Vim编辑器常用快捷方式

    这几天在学习shell编程 xff0c 其中常常会用到Linux下的vim编译器 xff0c 今天就总结一些在vim编辑器中常用的快捷键 xff0c 方便我们更好的使用 目录 一 vi编辑器基本概念 二 模式切换 三 编辑模式 四 命令行模
  • Linux面试相关知识点看着一文就够了

    今天和大家分享一下linux操作系统下主要用到的几个知识点 xff0c 分别是 xff1a linux目录结构 linux常用命令 文件权限操作 服务操作 yum安装命令 docker服务 vim编译器 pymysql测试连接 用户及组命令
  • Python对象比较及深浅拷贝

    今天和大家分享一个python语言中特别重要的一个知识点 xff0c 比较及拷贝 目录 一 61 61 和 is 二 深浅拷贝 2 1 浅拷贝 2 2 深拷贝 三 总结 一 61 61 和 is 等于 61 61 和is是Python中对象
  • python中的值传递和引用传递

    今天和大家分享python中很重要的一个知识点 xff1a 参数传递 xff0c 其中包括值传递和引用传递 目录 一 为什么要熟悉值传递和引用传递 1 1 值传递 1 2 引用传递 二 Python变量及其赋值 三 Python函数的参数传
  • MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

    MySQL8 0下DATE DATETIME和TIMESTAMP的自动初始化和更新 DATE日期类型DATETIME和TIMESTAMP的不同什么是时区自动变动 xff1f DATETIME和TIMESTAMP的相同点微秒小数部分自动初始化
  • Python爬虫实战分析

    今天看到特别好的一篇文章 xff0c 分享给大家 从头到尾看了一遍 xff0c 以实战的例子分析爬虫所需要用到的知识点 十分受益 真可谓 xff1a python万能模板 xff0c 有了这个模板 xff0c 想爬取什么内容 xff0c 根
  • ansible dns

    1 详细叙述ansible的工作原理 工作原理 xff1a ansible是基于Python开发 xff0c 集合众多运维工具的优势 xff0c 实现批量的部署操作 xff0c ansible是基于模块化 xff0c 本身并没有部署能力 x
  • pip 安装命令 及 配置Path路径

    pip 不是内部或外部命令 也不是可运行的程序 或批处理文件 pip 安装命令 及 配置环境变量 numpy 输入pip install numpy 时 xff0c 提示 以numpy 为例 pip 不是内部或外部命令 也不是可运行的程序
  • 1-python工厂模式

    文章目录 工厂模式定义 xff1a 它的优点 xff1a 可以有如下三种实现方式1 简单工厂模式2 工厂方法模式3 抽象工厂模式总结 工厂模式定义 xff1a 在面向对象编程中 xff0c 术语 工厂 表示一个负责创建替他类型对象的类 通常