python工厂函数原理,python工厂模式应用场景
大家好,本文主要讲python工厂方法模式的原理和实现。有兴趣的同学过来看看,如果对你有帮助记得收藏。
一.导言二工厂方法模式III的主要作用。工厂方法模式四。工厂模式v .抽象工厂摘要
目录
工厂模式是一种创造性的模式,它提供了创建对象的最佳方式。
在工厂模式下,我们在创建对象的过程中不会向客户端公开实现逻辑,而是通过一个通用的接口类指向新创建的对象。
一、简介
抽象工厂(Abstract Factory):提供创建产品的接口,调用者可以通过这个接口访问特定工厂的工厂方法newProduct()来创建产品。
ConcreteFactory:主要实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品:定义产品规格,描述产品的主要特性和功能。
ConcreteProduct:实现抽象产品定义的接口,由具体工厂创建,与具体工厂一一对应。
二、工厂方法模式的主要角色
内容:工厂类负责创建产品类的实例,而不是直接向客户机公开对象创建实现的细节。
代码(jiandan.py):
从abc导入ABCMeta,abstractmethod
类支付(元类=ABCMeta):
@抽象方法
延期支付(本人):
及格
类微信支付(支付):
def pay(自己,钱):
打印(微信支付%s%钱)
返回
支付宝类(支付):
def __init__(self,huabei=False):
self .华北=华北
def pay(自己,钱):
if self.huabei:
打印(支付%s%钱)
else:
打印(支付宝余额付款%s%钱)
类别支付工厂:
def create_pay(自身,方法):
if method==微信 :
返回微信支付()
elif方法==支付宝 :
退货支付宝()
elif方法==华北 :
还支付宝(华北=真)
else:
引发类型错误(没有这样的付款名称%s %方法)
#客户端
pf=PaymentFactory()
p=pf.create_pay(华北)
p.pay(100)
结果:
ABCMeta是python的元类,用于在Python程序中创建抽象基类,抽象基类中声明的抽象方法,用abstractmethod decorator修饰。
简单来说:创建一个公共抽象类,然后创建多个支付类来继承这个抽象类。具体的支付方式在各个支付类中实现,通过工厂类选择支付方式,使得客服只实现支付方式,不知道具体的实现方式。
优势:
对象创建的实现细节是隐藏的,客户端不需要修改代码。
缺点:
违反单一职责原则,将创作逻辑浓缩为工厂类。新增产品时,需要修改工厂类代码,违背了开闭原则。
三、简单工厂模式
内容:定义一个创建对象的接口(工厂类),让工厂子类决定实例化哪个产品类。
代码(factory_method.py):
从abc导入ABCMeta,abstractmethod
班级付款(我
taclass=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工厂方法模式内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。