当前位置: 首页 > news >正文

【python设计模式2】创建型模式1

目录

简单工厂模式

工厂方法模式


简单工厂模式

简单工厂模式不是23中设计模式中的,但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有:工厂角色、抽象产品角色、具体产品角色,通过例子来加深理解:

from abc import ABCMeta, abstractmethod# 抽象产品角色,以什么样的表现去使用
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))# 产品角色
class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 工厂类角色
class PaymentFactory:def ctreate_payment(self, method):if method == 'Alipay':return Alipay()elif method == 'WechatPay':return WechatPay()elif method == 'HuabeiPay':return Alipay(use_huabei=True)else:raise TypeError('No such payment named %s' % method)# 客户端调用。不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例
pf = PaymentFactory()
p = pf.ctreate_payment('HuabeiPay')
p.pay(100)

工厂方法模式

 简单工厂模式只创建一个工厂类,当有新的产品时,需要修改工厂类代码。而 工厂方法模式的每个具体产品对应一个具体的工厂类,不需要修改工厂类代码,并且同时也能满足隐藏对象创建的细节。但是工厂方法模式也是有缺点的,就是 每增加一个具体产品类,就必须增加一个相应的具体方法。        工厂模式方法模式的概念是定义了一个用于创建对象的接口(工厂接口),让子类决定实例化那一个产品类。角色有抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。通过例子来加深理解,每个具体产品对应一个具体的工厂类:

from abc import ABCMeta, abstractmethod# 抽象产品角色
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 具体产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 具体工厂角色
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatPayFactory(PaymentFactory):def create_payment(self):return Alipay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)hfp = HuabeiFactory().create_payment()
hfp.pay(100)  # 花呗支付了100元!

缺点是每增加一个具体产品类,就必须增加一个相应的具体方法:

from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))class BankPay(Payment):def pay(self, money):print("银行支付了%d元!" % (money))# 创建产品的工厂类的接口
class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 工厂类
class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class WechatPayPayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工厂类
class HuabeiPayFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)# 新增加银行支付的工厂类
class BankPayFactory(PaymentFactory):def create_payment(self):return BankPay()bfp = BankPayFactory().create_payment()
bfp.pay(100)  # 银行支付了100元!


http://www.mrgr.cn/news/29091.html

相关文章:

  • vue之axios根据某个接口创建实例,并设置headers和超时时间,捕捉异常
  • Hadoop学习--第一章 Hello大数据分布式
  • 批量将当前目录里的所有pdf 转化为png 格式
  • synchronized锁失灵?
  • Linux 常用操作指令大揭秘(下)
  • WebGIS三维地图框架--Cesium
  • (185)时序收敛--->(35)时序收敛三五
  • C++ 科目二 [dynamic_cast]
  • 企业开发时,会使用sqlalchedmy来构建数据库 结构吗? 还是说直接写SQL 语句比较多?
  • makefile 的语法(7):函数 word wordlist words firstword lastword ;
  • 一种快速遍历二叉树的方法
  • 构建高效、精准的动物情绪分类模型:基于深度学习的技术实践与探索
  • 认知小文3《打破桎梏,编程与人生的基本法则》
  • 程序中类与对象的理解(面向对象思想)
  • kali——foremost的使用
  • 中秋佳节,月圆人团圆
  • 【数据结构篇】~链表算法题3(环形链表)
  • 【时时三省】linux应用层开发经验总结
  • 【计算机基础】关于存储的各种概念
  • 《沈阳体育学院学报》
  • 【每日一题】LeetCode 2332.坐上公交的最晚时间(数组、双指针、二分查找、排序)
  • 笔记:BLIP源码之(2)模型是如何定义的
  • 机器学习、计算机视觉与NLP:从基础到深度学习的综合指南
  • Android 微信,手机文件管理,通过自己软件打开
  • 网络安全-LD_PRELOAD,请求劫持
  • 【揭秘Java】线程安全中的有序性之谜