首页 > 编程语言 >Python实现软件设计模式2:工厂方法模式

Python实现软件设计模式2:工厂方法模式

时间:2023-12-14 16:33:07浏览次数:39  
标签:__ Python self 模式 工厂 软件设计 产品 class def

特点

  • 工厂存在父类和子类,产品存在父类和子类。
  • 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象。

包含的角色

  • Product 抽象产品
  • ConcreteProduct 具体产品
  • Factory 抽象工厂
  • ConcreteFactory 具体工厂

模式分析

工厂方法模式是简单工厂模式的进一步抽象,核心的工厂类不在负责所有产品的创建,而是将具体的创建工作交给不同的子类去完成;增加具体产品==>增加具体工厂,符合“开闭原则”。

代码

from abc import ABC,abstractmethod

class TV(ABC):      # 抽象产品
    @abstractmethod
    def play(self):
        pass

class HaierTV(TV):  # 具体产品1
    def play(self):
        print(f"海尔电视播放中...") 

class HuaweiTV(TV): # 具体产品2
    def play(self):
        print(f"华为电视播放中...") 

class TVFactory(ABC):   # 抽象工厂
    @abstractmethod
    def productTV(self):
        pass

class HaierTVFactory(TVFactory):
    def productTV(self):
        print("海尔TV工厂生产海尔电视机!")
        return HaierTV()

class HuaweiTVFactory(TVFactory):
    def productTV(self):
        print("华为TV工厂生产华为电视机!")
        return HuaweiTV()

class Client:
    def __init__(self, pname):
        self.product = pname    # 可以从配置文件读取,也可以用户在main函数中创建对象时输入
    
    def run(self):
        try:
            factory = eval(self.product)()  # 字符串名称  转  具体产品工厂对象
            tv = factory.productTV()
            tv.play()
        except NameError as e:
            print(f"Error! Product '{self.product}' doesn't exits...")

if __name__ == '__main__':
    t1 = Client('HaierTVFactory')
    t1.run()

    t2 = Client('HuaweiTVFactory')
    t2.run()

总结

  • 和简单工厂模式一样,它将对象的创建和使用分离,向客户用藏了哪种具体产品类型将被实例化这一细节,因为创建产品对象的细节完全封装在具体工厂内部;
  • 在系统中加入新产品时,完全符合开闭原则;
  • 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,给系统带来额外开销;

标签:__,Python,self,模式,工厂,软件设计,产品,class,def
From: https://www.cnblogs.com/Higgerw/p/17901462.html

相关文章

  • Python库大全,建议收藏留用!
    学Python,想必大家都是从爬虫开始的吧。毕竟网上类似的资源很丰富,开源项目也非常多。Python学习网络爬虫主要分3个大的版块:抓取,分析,存储当我们在浏览器中输入一个url后回车,后台会发生什么?简单来说这段过程发生了以下四个步骤:查找域名对应的IP地址。向IP对应的服务器发送请求。服务器......
  • Python多线程计算的方法及示例代码
    Python是一种非常流行的编程语言,支持多种并发编程的方式,其中包括多线程。多线程允许程序同时执行多个任务,从而提高了程序的运行效率。下面将介绍Python中多线程计算的几种常见方法,并给出具体的示例代码。方法一:使用标准库threadingPython标准库中提供了threading模块,通过创建Thread......
  • 组合模式
    组合模式是树形结构的管理,例如组织结构,文件系统等。组合模式有三个角色,一个是抽象构件,一个是容器构件,一个是叶子构件,容器构件和叶子构件的区别就是容器构件可以添加删除子容器或者叶子,叶子构件没有此功能。组合模式分为透明组合模式和安全组合模式,其区别是透明模式会把增加或者......
  • Python项目之ATM1.0单模块函数版
    ATM1.0【作业】#ATM:提款姬#===================用户功能菜单=====================#1.注册#2.登陆#3.取款#4.转账#5.充值余额#6.查看流水#......
  • Python面向对象之抽象类与抽象方法
    C++和Java中面向对象中有抽象类或接口的说法,在python中没有abstract或interface这样的内置关键字。但是abc模块(AbstractBaseClasses)实现了这些抽象类检查的功能,其中ABC是抽象基类。@abstractmethod表示这个方法是一个抽象方法,子类必须重写。关于抽象类与抽象方法的示例代码如下:......
  • python 文件下载快速、安全和简单的方式
    Python文件下载是指使用Python编写的程序来下载文件。给出一个使用urllib库实现文件下载的示例代码:上面的代码中,url变量表示要下载的文件的URL,save_path变量表示文件保存的路径,最后使用urllib.request)函数来下载文件。Python文件下载是指使用Python编写的程序来下载文件。给出一个......
  • 适配器模式
    适配器模式分为类适配器和对象适配器。适配器有三个角色,一个是目标(Target),一个是被适配者,一个是适配者。类适配器和对象适配器的区别是,类适配器是适配者继承目标(Targer)的同时也实现被适配者的抽象接口,对象适配器是适配者只继承目标(Targer),适配者内会有一个被适配者对象。示例代......
  • 为什么Python赢了,别的语言都干嘛去了?
    为什么Python赢了,别的语言都干嘛去了?作者:刘欣2019-12-0910:00:46企业动态1995年,当JimHugunin正在麻省理工学院和他的硕士论文“搏斗”时,他广泛地使用了Matlab,因为在那篇论文中,他需要对实验结果进行数据分析,和理论值比较。 人工智能时代,为什么Python大放异彩,别的语言都......
  • python远程关闭liunx计算机并转化成可执行文件exe
    1.安装Python首先,确保您已经安装了Python。访问https://www.python.org/downloads/,下载并安装适合您操作系统的Python发行版。2.安装JupyterNotebook接下来,我们需要在计算机上安装JupyterNotebook。在命令提示符(Windows)或终端(Mac和Linux)中运行以下命令:pipinstalljupyter......
  • 【Python】人工智能-机器学习——不调库手撕深度网络分类问题
    1.作业内容描述1.1背景数据集大小150该数据有4个属性,分别如下Sepal.Length:花萼长度(cm)Sepal.Width:花萼宽度单位(cm)Petal.Length:花瓣长度(cm)Petal.Width:花瓣宽度(cm)category:类别(IrisSetosa\IrisVersicolour\IrisVirginica)1.2要求在不调用机器学习库的情......