python工厂方法模式原理与实现

 更新时间:2022年02月16日 11:36:52   作者:harder work  
大家好,本篇文章主要讲的是python工厂方法模式原理与实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、简介

工厂模式是属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象的过程中不会向客户端暴露实现逻辑,而是通过一个共同的接口类来指向新创建的对象。

二、工厂方法模式的主要角色

抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法newProduct()来创建产品。
具体工厂(ConcreteFactory):主要实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

三、简单工厂模式

内容:不直接向客户端暴露对象创建实现的细节,而是通过工厂类来负责创建产品类的实例。

具体代码(jiandan.py):

from abc import ABCMeta, abstractmethod
 
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self):
        pass
 
class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s" % money)
        return
 
class Alipay(Payment):
    def __init__(self, huabei=False):
        self.huabei = huabei
    def pay(self, money):
        if self.huabei:
            print("花呗支付%s" % money)
        else:
            print("支付宝余额支付%s" % money)
 
class PaymentFactory:
    def create_pay(self, method):
        if method == "wechat":
            return WechatPay()
        elif method == "alipay":
            return Alipay()
        elif method == "huabei":
            return Alipay(huabei=True)
        else:
            raise TypeError("No such payment name %s" % method)
 
# client
pf = PaymentFactory()
p = pf.create_pay("huabei")
p.pay(100)

结果:

ABCMeta是python的一个元类,用于在Python程序中创建抽象基类,抽象基类中声明的抽象方法,使用abstractmethod装饰器装饰。

简单明了的说:创建一个公共的抽象类,然后创建多个支付的类继承这个抽象类,各种支付类里实现具体的支付方式,通过工厂类选择支付方式,这样客服端只实现支付方式,不需要知道具体的实现方法。

优点:

隐藏了对象创建的实现细节客户端不需要修改代码

缺点:

违反了单一职责原则,将创建逻辑集中到一个工厂类里当添加新产品时,需要修改工厂类代码,违反了开闭原则 

四、工厂模式

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

具体代码(factory_method.py):

from abc import ABCMeta, abstractmethod
 
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self):
        pass
 
class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s" % money)
        return
 
class Alipay(Payment):
    def __init__(self, huabei=False):
        self.huabei = huabei
    def pay(self, money):
        if self.huabei:
            print("花呗支付%s" % money)
        else:
            print("支付宝余额支付%s" % money)
 
class PaymentFactory(metaclass=ABCMeta):
    @abstractmethod
    def create_method(self):
        pass
 
class AlipayFactory(PaymentFactory):
    def create_method(self):
        return Alipay()
 
class WechatFactory(PaymentFactory):
    def create_method(self):
        return WechatPay()
 
class HuabeiFactory(PaymentFactory):
    def create_method(self):
        return Alipay(huabei=True)
 
pf = HuabeiFactory()
p = pf.create_method()
p.pay(100)

结果:

五、抽象工厂模式

 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或者相互依赖的对象。

与工厂模式相比,抽象工厂模式中的每一个产品都生产一套产品。

具体代码(abstract_factory.py):

from abc import ABCMeta, abstractmethod
"""
抽象产品
"""
 
class PhoneShell(metaclass=ABCMeta):
    @abstractmethod
    def show_shell(self):
        pass
 
class OS(metaclass=ABCMeta):
    @abstractmethod
    def show_os(self):
        pass
 
class CPU(metaclass=ABCMeta):
    @abstractmethod
    def show_cpu(self):
        pass
 
# 抽象工厂
class PhoneFactory(metaclass=ABCMeta):
    @abstractmethod
    def make_shell(self):
        pass
    @abstractmethod
    def make_cpu(self):
        pass
    @abstractmethod
    def make_os(self):
        pass
 
# 具体产品
class SmallShell(PhoneShell):
    def show_shell(self):
        print("普通手机壳小手机壳")
 
class BigShell(PhoneShell):
    def show_shell(self):
        print("普通手机壳大手机壳")
 
class AppleShell(PhoneShell):
    def show_shell(self):
        print("苹果手机壳")
 
class SnapDragonCPU(CPU):
    def show_cpu(self):
        print("骁龙CPU")
 
class MediaTekCPU(CPU):
    def show_cpu(self):
        print("联发科CPU")
 
class AppleCPU(CPU):
    def show_cpu(self):
        print("苹果CPU")
 
class AppleOS(OS):
    def show_os(self):
        print("苹果OS系统")
 
class AndroidOS(OS):
    def show_os(self):
        print("Android系统")
 
class IOS(OS):
    def show_os(self):
        print("IOS系统")
 
# 具体工厂
class MiFactory(PhoneFactory):
    def make_cpu(self):
        return SnapDragonCPU()
    def make_os(self):
        return AndroidOS()
    def make_shell(self):
        return BigShell()
 
class HuaweiFactory(PhoneFactory):
    def make_cpu(self):
        return MediaTekCPU()
    def make_os(self):
        return AndroidOS()
    def make_shell(self):
        return SmallShell()
 
class IPhoneFactory(PhoneFactory):
    def make_cpu(self):
        return AppleCPU()
    def make_os(self):
        return AppleOS()
    def make_shell(self):
        return AppleShell()
 
class Phone:
    def __init__(self, cpu, os, shell):
        self.cpu = cpu
        self.os = os
        self.shell = shell
    def show_info(self):
        print("手机信息:")
        self.cpu.show_cpu()
        self.os.show_os()
        self.shell.show_shell()
 
def make_phone(factory):
    cpu = factory.make_cpu()
    os = factory.make_os()
    shell = factory.make_shell()
    return Phone(cpu, os, shell)
 
p1 = make_phone(MiFactory())
p1.show_info()

结果:

优点:

将客户端与类的具体实现相分离每个工厂创建了一个完整的产品系列,使得易于交换产品系列有利于产品的一致性(及产品之间的约束关系)

缺点:

难以支持新种类的抽象产品

总结

到此这篇关于python工厂方法模式原理与实现的文章就介绍到这了,更多相关python工厂方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现排序算法、查找算法和图遍历算法实例

    Python实现排序算法、查找算法和图遍历算法实例

    这篇文章主要介绍了Python实现排序算法、查找算法和图遍历算法实例,排序算法、查找算法和图遍历算法是计算机科学中常见且重要的算法。它们在数据处理、搜索和图结构等领域发挥着关键作用,需要的朋友可以参考下
    2023-08-08
  • 使用Numpy打乱数组或打乱矩阵行

    使用Numpy打乱数组或打乱矩阵行

    这篇文章主要介绍了使用Numpy打乱数组或打乱矩阵行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • jupyter notebook 参数传递给shell命令行实例

    jupyter notebook 参数传递给shell命令行实例

    这篇文章主要介绍了jupyter notebook 参数传递给shell命令行实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python字典,函数,全局变量代码解析

    Python字典,函数,全局变量代码解析

    这篇文章主要介绍了Python字典,函数,全局变量代码解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python字符串的基本操作方法(非常详细)

    Python字符串的基本操作方法(非常详细)

    字符串是python中最常见的数据类型,创建字符串只需用引号括起来分配给一个变量即可,这篇文章主要给大家介绍了关于Python字符串的基本操作方法的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Pytorch中关于model.eval()的作用及分析

    Pytorch中关于model.eval()的作用及分析

    这篇文章主要介绍了Pytorch中关于model.eval()的作用及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python3如何根据函数名动态调用函数

    Python3如何根据函数名动态调用函数

    这篇文章主要介绍了Python3如何根据函数名动态调用函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Python实现绘图散点图(scatter)

    Python实现绘图散点图(scatter)

    这篇文章主要介绍了Python实现绘图散点图方式(scatter),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 一文学会利用python解决文章付费限制问题

    一文学会利用python解决文章付费限制问题

    本篇文章主要介绍利用Python爬虫爬取付费文章,适合练习爬虫基础同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧
    2023-05-05
  • Python 用户登录验证的小例子

    Python 用户登录验证的小例子

    Python 用户登录验证的小例子,需要的朋友可以参考一下
    2013-03-03

最新评论