ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(3)-创建型:工厂方法模式实践

python 面向对象设计模式实践篇(3)-创建型:工厂方法模式实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-24 17:29:00 0 删除 编辑

工厂方法模式


所属分类

  • 创建型模式

意图

  • 定义一个用于创建对象的工厂抽象类接口,让实现工厂抽象类的具体的工厂类选择决定实例化具体的产品类实例。

  • 产品(抽象产品,具体产品)
  • 工厂(抽象工厂,具体工厂)

角色对象:

  • 抽象工厂角色(creator):具体工厂角色的抽象类接口(具体工厂角色的父类)

  • 具体工厂角色(Concreat creator):用于客户端调用以创建对应的具体产品角色的对象

  • 抽象产品角色(Product):具体产品类的抽象类接口(具体产品角色的父类)

  • 具体产品角色(Concreat Product):被具体具体工厂角色所调用需要创建的类

和简单工厂的区别

  • 工厂方法模式基于简单工厂的扩展演化。
  • 工厂方法不再通过一个统一的工厂类来创建具体的所有对象(不在委任一个工厂担当创建创建具体类实例)
  • 细化工厂,每个工厂单一话职责,工厂方法中每个具体类产品对应一个对应工厂
  • 新品加入,只要继承抽象产品角色、抽象工厂角色的约定来开发新的具体工厂角色和具体产品角色即可。

实现方式:

#!/usr/bin/evn python
# coding=utf-8

from  abc import ABCMeta,abstractmethod

# 供货商抽象类---抽象产品定义
class Supplier(metaclass=ABCMeta):

    # 定义抽象方法,卖出商品的方法,买家通过这个方法来获取对象
    @abstractmethod
    def make(self):
        pass

# 商品具体化
class Yan(Supplier):
    def make(self):
        print("商铺提供订单需求-开始生产盐")
        return self

class Bingjilin(Supplier):
    def make(self):
        print("商铺提供订单需求-生产冰激凌")
        return self


# ===========================================

# 工厂抽象类---抽象工厂定义
class FactoryShopMetaclass(metaclass=ABCMeta):

    # 定义抽象方法,卖出商品的方法,买家通过这个方法来获取对象
    @abstractmethod
    def sell_product(self, objprodeuct=None, num=1):
        pass

# 生产烟的工厂类--工厂实现类
class YanFactoryShopMetaclass(FactoryShopMetaclass):

    # 卖出烟商品的方法,买家通过这个方法来获取对象--默认永远只是生产烟的对象
    def sell_product(self, objprodeuct="Yan", num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出烟了num:" + str(len(product))

# 生产烟的工厂类--工厂实现类
class BingjilinFactoryShopMetaclass(FactoryShopMetaclass):

    # 卖出冰激凌商品的方法,买家通过这个方法来获取对象--默认永远只是生产冰激凌的对象
    def sell_product(self, objprodeuct="Bingjilin", num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出冰激凌了num:" + str(len(product))


if __name__ == '__main__':

    # print( globals())
    # 开始有人光顾商店了,有人说要烟,冰激凌,食盐,我开始问工厂索要对象
    print("***" * 20)
    # 问烟工厂要3包烟
    print('问烟工厂要3包烟:',YanFactoryShopMetaclass().sell_product(num=3))
    print("***" * 20)
    # 问冰激凌工厂要2个
    print('问冰激凌工厂要2个',YanFactoryShopMetaclass().sell_product(num=2))



输出结果:

************************************************************
商铺提供订单需求-开始生产盐
商铺提供订单需求-开始生产盐
商铺提供订单需求-开始生产盐
问烟工厂要3包烟: 卖出烟了num:3
************************************************************
商铺提供订单需求-开始生产盐
商铺提供订单需求-开始生产盐
问冰激凌工厂要2个 卖出烟了num:2

上面的代码中,

  • 每个具体类仅负责具体某个的产品对象类封装
  • 每个工厂类负责对某个的产品对象类的创建

优点:

  • 编码的代码更具灵活性
  • 代码是符合"开闭原则"的

缺点:

  • 新生产品,需要创建一个具体新品类和一个具体工厂类,过程麻烦

个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111703