首页 > 编程语言 >Python实现软件设计模式3:抽象工厂模式

Python实现软件设计模式3:抽象工厂模式

时间:2023-12-17 10:44:05浏览次数:27  
标签:Python self 模式 工厂 软件设计 抽象 产品 class def

特点

  • 系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)
  • 在工厂方法模式中,只有一个产品等级结构
  • 一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构
  • 产品族是指由同一个工厂生产,位于不同产品等级结构的一组产品

角色组成

  • 抽象工厂 Abstract Factory
  • 具体工厂 Concrete Factory
  • 抽象产品 Abstract Product
  • 具体产品 Concrete Product

模式实例

电器工厂:一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而向同类型的电器构成了一个产品等级结构。

代码实现

from abc import ABC,abstractmethod

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

class AirConditioner(ABC):  # 抽象产品 2
    @abstractmethod
    def changetemperature(self):
        pass

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

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

class HaierAirCon(AirConditioner):  # 具体产品
    def changetemperature(self):
        print("海尔空调温度改变中!!!")

class HuaweiAirCon(AirConditioner): # 具体产品
    def changetemperature(self):
        print("华为空调温度改变中!!!")

class EFactory(ABC):    # 抽象工厂
    @abstractmethod
    def produceTV(self):
        pass
    
    @abstractmethod
    def produceAirCon(self):
        pass

class HaierFactory(EFactory):   # 具体产品族工厂1
    def produceTV(self):
        return HaierTV()
    
    def produceAirCon(self):
        return HaierAirCon()

class HuaweiFactory(EFactory):  # 具体产品族工厂2
    def produceTV(self):
        return HuaweiTV()
    
    def produceAirCon(self):
        return HuaweiAirCon()

class Client:                   # 客户端
    def __init__(self, FactoryName):    # 传入工厂名称参数
        self.factname = FactoryName

    def run(self):
        try:
            factory = eval(self.factname)()
            tv = factory.produceTV()
            tv.play()

            ac = factory.produceAirCon()
            ac.changetemperature()
        except NameError:
            print(f"Error! Factory '{self.factname}' doesn't exits...")

if __name__ == '__main__':
    f1 = Client('HuaweiFactory')
    f1.run()

    f2 = Client('HaierFactory')
    f2.run()

总结

  • 客户端始终只使用同一个产品族中的对象
  • 增加新的产品族(品牌)很方便,无序修改已有系统源码,只需要新增已有抽象工厂的子类并在其中实现产品构造方法,符合开闭原则!
  • 增加新的产品等级结构较麻烦,因为需要修改原有系统代码(所有工厂类,包括抽象工厂和具体品牌工厂),违背了开闭原则!
  • 适合使用场景:一个系统不应该依赖于产品类实例如何被创建、组合和表达的细节;产品等级结构稳定,不会增加或删除已有的产品等级结构;系统中有多个产品族,但每次只使用其中某一个产品族

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

相关文章

  • python 使用 Google Gemini API
    python使用GoogleGeminiAPI注册APIKEY:GoogleAIStudio[免费]importbase64importrequestsimportjsonAPI_KEY='yourapikey'img_path='./scones.jpg'#设置模型参数和过滤规则https://ai.google.dev/api/rest/v1beta/SafetySetting?hl=zh-cn#H......
  • Python NumPy 与 Pandas 结合使用
    1、NumPy数组与PandasDataFrame/Series转换NumPy数组与PandasDataFrame/Series是Python中常用的两种数据结构,它们都用于存储和处理数据。NumPy数组是一种多维数组,它可以存储一维、二维、三维或更高维的数据。NumPy数组的优点是速度快、效率高,适合用于数值计算。Panda......
  • python之tkinter的button控件
    按钮组件,用于监听用户行为,调用具体功能函数。按钮上可以是文字或者图片。语法:Button(master,option……)master父容器option参数参数:参数属性举例或备注bg按钮背景颜色 fg按钮前景颜色按钮上的文字颜色bd按钮边框大小边框会呈现立体感activebackground鼠标点击时按钮背景色 act......
  • 面试Python时必会的知识点总结
    目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言。对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相关的知识点偏偏又是面试中的高频问题,所以本文我以python为例,带大家快速搞定面向......
  • python 基础极简解释
    python基础局部与全局声明全局变量global数据存储列表变量=[数据1,数据2]变量[索引]基本:方法说明列表名.index(值)输入列表值取索引列表名[索引]=数据赋值lea(列表)统计元素列表.count(数据)统计数据出现的次数排序:方法说明列表......
  • Python中级之解压赋值
    解压赋值【一】解压赋值的概念解压赋值是指将一个可迭代对象(如列表、元组、字典的键值对等)中的元素拆分并分配给多个变量。这种技术非常方便,可以简洁地从一个数据结构中提取元素并将它们分配给多个变量。需要确保变量的数量与可迭代对象中的元素数量匹配,否则会引发ValueError......
  • Python装饰器:深入探索功能增强的神奇工具(特点+应用+举例)
    Python装饰器是一项强大的特性,它允许程序员在不改变函数或类本身的情况下,增加、扩展或修改它们的行为。从日志记录到权限验证,再到性能分析和缓存,装饰器在Python编程中发挥着重要的作用。本文将深入探讨装饰器的各个方面,从基本概念到实际应用,带您领略装饰器的神奇之处。装饰器是Pyth......
  • python高级之生成器
    生成器一、生成器与yield若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象defmy_range(start,stop,step=1):print('start...')whilestart<stop:yieldstartstart+=stepprint('end...')g=my_range(0,3)......
  • 设计模式概念和分类
    (设计模式概念和分类)概念设计模式一般是指软件开发人员在开发的时候遇到软件设计问题时的一般解决方案,这样当我们遇到重复问题的时候,就能够一次一次地使用该方案而避免了重复劳动。并且可以提高代码的可重用性和可读性,增强系统的可靠性和可维护性,解决一系列的复杂问题,提高协作效......
  • python爬虫
    #(2)importrequestsurl="https://www.google.cn/"foriinrange(20):try:r=requests.get(url,timeout=30)r.raise_for_status()r.encoding='utf-8'print(r.text)except:print('')......