iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python设计模式中的创建型工厂模式
  • 916
分享到

Python设计模式中的创建型工厂模式

2024-04-02 19:04:59 916人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、工厂模式(Factory Pattern)二、应用场景三、编码示例1、简单工厂模式2、工厂方法模式3、抽象工厂模式一、工厂模式(Factory Pattern) 工厂模式(F

一、工厂模式(Factory Pattern)

工厂模式(Factory Pattern),提供了一种实例化(创建)对象的最佳方式。

在工厂模式中,首先定义了一个抽象的工厂类(class Factory),并且在该工厂类中定义了提供了一个通用的、用于实例化对象的 Interface(接口)函数。然后当 Client 想要实例化某个具体的类的对象时,只需要将需求告诉工厂类即可,由工厂类按需求去完成对象的实例化并返回。而 Client 作为调用者,则无需知道对象实例化的任何细节,这意味着任意的 Client 都无需要考虑根据对象的实例化细节来调整自身的代码。

例如:当我们需要购买一批电脑,只要把我们的需求告诉电脑工厂,电脑工厂就会帮我们把这批电脑做好,而不用我们自己去做这个电脑的,也不用我们自己去知道这个电脑是怎么做出来的,这就是工厂模式。

工厂模式带来的好处就是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。是一种解耦思想的实践。

二、应用场景

  • Multi-Drivers(多驱动架构

三、编码示例

1、简单工厂模式

简单工厂模式,只是做了一层简单的封装,将不同对象的实例化操作都单独放到了一个工厂类中。

当我们需要实例化某个对象时,只需把我们的需求告诉简单工厂类,然后由这个简单工厂类根据我们的需求去创建对应的对象即可。适用于简单的业务场景。

优点: 简单工厂模式可以根据需求,动态生成使用者所需类的对象,而使用者不用去知道怎么创建对象,使得各个模块各司其职,降低了系统的耦合性。

缺点: 扩展性差,违背了开闭原则(开闭原则指的是:软件实现应该对扩展开放,对修改关闭)。新增产品时,需要修改简单工厂类的代码。

实体角色:

  • 产品的抽象类
  • 具体的产品子类
  • 简单工厂类
import abc

# 产品的抽象类
class Productor(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def product(self, car):
        pass
        
# 更具体的某个产品类,是产品抽象类的子类
class Xiaomi(Productor):
    """
    小米手机
    """
    def product(self, price):
        return f"制造一部小米手机,售价{price}元"
        
    def __repr__(self):
        return f"Xiaomi,{id(self)}" 
    
# 更具体的某个产品类,是产品抽象类的子类
class Huawei(Productor):
    """
    华为手机
    """
    def product(self, price):
        return f"制造一部华为手机,售价{price}元"
        
    def __repr__(self):
        return f"Huawei,{id(self)}" 
    
# 简单工厂类
class PhoneBrandFactory:
    """
    简单工厂
    """
    def create_productor(self, brand):
        if brand == "Xiaomi":
            return Xiaomi()
        if brand == "Huawei":
            return Huawei()
        else:
            raise TypeError(f"没有名为{brand}的手机生产商。")
        

if __name__ == "__main__":
    # 通过简单工厂类提供的接口函数来获得某个具体的产品类的对象
    Xiaomi = PhoneBrandFactory().create_productor("Xiaomi")
    Huawei = PhoneBrandFactory().create_productor("Huawei")
    print(Xiaomi)
    print(Huawei)
    print(Xiaomi.product(2999))
    print(Huawei.product(5999))

2、工厂方法模式

工厂方法模式,工厂类派生了任意个子工厂类,每个子工厂类对应一个具体的产品类,则某个产品类的对象的实例化就交由这个子工厂类来完成。

工厂方法模式是简单工厂模式的改进,当我们需要扩展一个新产品时,只需要扩展一个新的子工厂类即可,而不用去修改工厂类原有的代码,这样就符合了开闭原则。

优点: 扩展性好,符合了开闭原则。新增一种产品时,只需增加改对应的产品类和对应的工厂子类即可。同时,也使得每个产品类和对应的工厂子类符合了单一职责原则,每个工厂只负责一种产品,而不是由一个工厂去生成所有商品。

缺点: 当我们新增产品时,还需要提供对应的工厂类,系统中类的个数将会成倍增加,相当于增加了系统的复杂性。

实体角色:

  • 产品的抽象类
  • 具体的产品子类
  • 工厂类
  • 具体的工厂子类
import abc

# 产品的抽象类
class Productor(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def product(self, car):
        pass
        
# 更具体的某个产品类,是产品抽象类的子类
class Xiaomi(Productor):
    """
    小米手机
    """
    def product(self, price):
        return f"制造一部小米手机,售价{price}元"
        
    def __repr__(self):
        return f"Xiaomi,{id(self)}" 
    
# 更具体的某个产品类,是产品抽象类的子类
class Huawei(Productor):
    """
    华为手机
    """
    def product(self, price):
        return f"制造一部华为手机,售价{price}元"
        
    def __repr__(self):
        return f"Huawei,{id(self)}" 
    
# 工厂类
class PhoneBrandFactory(metaclass=abc.ABCMeta):
    """
    抽象工厂
    """
    @abc.abstractmethod
    def create_productor(self, brand):
        pass
    
# 具体产品对应的子工厂类
class XiaomiFactory(PhoneBrandFactory):
    def create_productor(self):
        return Xiaomi()
    
# 具体产品对应的子工厂类
class HuaweiFactory(PhoneBrandFactory):
    def create_productor(self):
        return Huawei()


if __name__ == "__main__":
    # 由这个子工厂类来完成对应的某个产品类的对象实例化
    Xiaomi = XiaomiFactory().create_productor()
    Huawei = HuaweiFactory().create_productor()
    print(Xiaomi)
    print(Huawei)
    print(Xiaomi.product(2999))
    print(Huawei.product(5999))

3、抽象工厂模式

抽象工厂模式,又是工厂方法模式的改进。工厂方法模式解决的是生产不同品牌的同一类型的电脑,而抽象工厂模式解决的是生产不同品牌的多种类型的电脑。

比如,工厂方法模式中的电脑工厂只能生产老式的台式电脑,而如果现在需要生产台式电脑,笔记本电脑,平板电脑等多个种类的电脑的话,那么工厂方法模式就不太方便了。而抽象工厂模式可以解决电脑工厂生产多个种类电脑的问题,也就是解决一个工厂生产多种类型的产品的问题。

如果我们需要台式电脑,又需要笔记本电脑,要多种产品时,工厂方法模式无法满足我们的需求;而抽象方法模式,提前在抽象工厂中,定义好了可能需要的多种产品,比如:台式电脑,笔记本电脑,平板电脑等,当有需求的时候,我们只需要创建相关子类和相关子工厂类即可。

优点: 抽象工厂类创建了多个类型的产品,当有需求时,可以创建相关子产品类和子工厂类来获取。也就是可以满足生产不同品牌的不同类型的电脑。

缺点: 扩展新种类产品时困难。抽象工厂模式需要我们在工厂抽象类中提前确定了可能需要的产品种类,以满足不同品牌的多种产品的需求。但是如果我们需要的产品种类并没有在工厂抽象类中提前确定,那我们就需要去修改工厂抽象类了,而一旦修改了工厂抽象类,那么所有的工厂子类也需要修改,这样显然扩展不方便。

实体角色:

  • 产品功能特性抽象类
  • 具体的产品功能特性子类
  • 产品的抽象类
  • 具体的产品子类
  • 抽象工厂类
import abc

# 产品功能特性抽象类
class Phoneshell(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def shell(self):
        pass
   
class Cpu(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def cpu(self):
        pass
     
class OS(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def system(self):
        pass
    
# 具体的产品功能特性类
class SmallShell(PhoneShell):
    @property
    def shell(self):
        return "小屏幕"

class BigShell(PhoneShell):
    @property
    def shell(self):
        return "大屏幕"
    
class SnapDraGonCpu(Cpu):
    @property
    def cpu(self):
        return "骁龙cpu"
        
class AppleCpu(Cpu):
    @property
    def cpu(self):
        return "苹果cpu"
        
class Android(OS):
    @property
    def system(self):
        return "安卓系统"    
    
class iOS(OS):
    @property
    def system(self):
        return "ioS系统"
    
# 产品的抽象类
class ProductPhone:
    
    def __init__(self, factory):
        self.factory = factory()
        
    def product(self):
        self.shell = self.factory.product_shell()
        self.cpu = self.factory.product_cpu()
        self.OS = self.factory.product_system()
    
    def show_info(self):
        print(f"{self.factory}", f"配置信息:{self.shell.shell}, {self.cpu.cpu}, {self.OS.system}")
            
# 具体的产品子类
class XiaomiFactory(PhoneFactory):
    def product_shell(self):
        return BigShell()
    
    def product_cpu(self):
        return SnapDragonCpu()
    
    def product_system(self):
        return Android()
    
    def __repr__(self):
        return "小米手机,售价2999!"
        
class IphoneFactory(PhoneFactory):
    def product_shell(self):
        return SmallShell()
    
    def product_cpu(self):
        return AppleCpu()
    
    def product_system(self):
        return IOS()
    
    def __repr__(self):
        return "苹果手机,售价8999!"
    
# 抽象工厂类
class PhoneFactory(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def product_shell(self):
        pass
    
    @abc.abstractmethod
    def product_cpu(self):
        pass
    
    @abc.abstractmethod
    def product_system(self):
        pass 

        
if __name__ == "__main__":
    xiaomi = ProductPhone(XiaomiFactory)
    xiaomi.product()
    xiaomi.show_info()
    
    iphone = ProductPhone(IphoneFactory)
    iphone.product()
    iphone.show_info()

到此这篇关于python设计模式中的创建型工厂模式的文章就介绍到这了,更多相关Python工厂模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python设计模式中的创建型工厂模式

本文链接: https://www.lsjlt.com/news/139180.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python设计模式中的创建型工厂模式
    目录一、工厂模式(Factory Pattern)二、应用场景三、编码示例1、简单工厂模式2、工厂方法模式3、抽象工厂模式一、工厂模式(Factory Pattern) 工厂模式(F...
    99+
    2022-11-13
  • Python设计模式中的创建型工厂模式怎么用
    这篇文章主要介绍Python设计模式中的创建型工厂模式怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、工厂模式(Factory Pattern)工厂模式(Factory Pattern),提供了一种实例化(创...
    99+
    2023-06-29
  • .Net创建型设计模式之简单工厂模式(Simple Factory)
    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类...
    99+
    2022-11-13
  • .Net创建型设计模式之工厂方法模式(Factory Method)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、工厂方法模式的代码实现六、Factory Method模式的几个要点1、工...
    99+
    2022-11-13
  • .Net创建型设计模式之抽象工厂模式(Abstract Factory)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、抽象工厂的具体代码实现客户程序:应用到具体程序(现代风格):改造第一种改造...
    99+
    2022-11-13
  • Java创建型设计模式之抽象工厂模式(Abstract Factory)
    目录抽象工厂模式概述产品等级结构与产品族优缺点主要角色抽象工厂模式的基本使用创建抽象产品创建具体产品创建抽象工厂创建具体工厂客户端执行抽象工厂模式 概述 抽象工厂模式(Abastra...
    99+
    2022-11-13
  • Python设计模式创建型原型模式
    目录一、原型模式二、应用场景三、代码示例一、原型模式 原型是相对于复制、克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的。 原型模...
    99+
    2022-11-13
  • Java创建型设计模式之工厂方法模式深入详解
    目录简单工厂模式定义产品对象创建工厂类工厂使用反射工厂方法模式概述应用场景优缺点主要角色工厂方法模式的基本使用创建抽象产品创建具体产品创建抽象工厂创建具体工厂客户端执行简单工厂模式 ...
    99+
    2022-11-13
  • Java 深入理解创建型设计模式之抽象工厂模式
    1.什么是抽象工厂模式? 抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。抽象工厂模式可以将简单工厂模式和工厂方法模式进...
    99+
    2022-11-13
  • Python 设计模式中的创建型建造者模式
    目录一、建造者模式二、代码示例一、建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)...
    99+
    2022-11-13
  • JAVA设计模式之工厂模式(三种工厂模式)
    1.工厂模式可以分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 简单工厂其实不是一个标准的的设计模式。GOF 23 种设计模式...
    99+
    2023-09-04
    设计模式
  • java编程创建型设计模式工厂方法模式示例详解
    目录1.什么是工厂方法模式?2.案例实现3.JDK中的工厂方法模式1.什么是工厂方法模式? 工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐...
    99+
    2022-11-13
  • Python 设计模式创建型单例模式
    目录一、单例模式二、应用场景三、编码示例1.单线程中的单例模式方式一、重载类构造器方式二、实现单例装饰器2.多线程中的单例模式方式三、重载具有线程锁的类构造器一、单例模式 单例模式,...
    99+
    2022-11-13
  • Python设计模式之抽象工厂模式
    python面向对象编程入门,我们需要不断学习进步 """抽象工厂模式的实现""" import random class PetShop: """宠物商店""" def __init_...
    99+
    2022-06-04
    模式 抽象 工厂
  • C#设计模式之工厂模式
    这是我们用得比较多的一种设计模式,也是23种标准设计模式之一,使用前面讲的简单工厂设计模式,遇到具体产品经常变换时就不太适合了,违反了开闭设计原则;怎么才能避免修改工厂类呢?工厂方法...
    99+
    2022-11-13
  • javascript设计模式之工厂模式
    目录介绍UML类图工厂模式的场景总结介绍 将new操作单独封装遇到new时,就要考虑是否应该使用工厂模式比如买汉堡:直接点餐、取餐,我们不会亲手做,商店要“封装&rdqu...
    99+
    2022-11-12
  • Java设计模式——工厂设计模式详解
    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。工厂模式的形态工厂模式主要用一下几种形态:简单工厂(Simple Factory)。2:工厂方法(Factory Method)。3:抽象工厂(Abstract...
    99+
    2023-05-30
    java 设计模式 ava
  • python设计模式之抽象工厂模式详解
    抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它...
    99+
    2022-11-12
  • PHP设计模式之工厂模式详解
    工厂模式是一种创建型设计模式,它提供了一种统一的方式来创建对象,而不用直接实例化对象。工厂模式可以隐藏对象创建的细节,客户端只需要调...
    99+
    2023-08-14
    php
  • 设计模式之什么是工厂模式
    本篇内容主要讲解“设计模式之什么是工厂模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“设计模式之什么是工厂模式”吧! 01 简单工厂方法简单工厂方法...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作