ITPub博客

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

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

原创 数据库开发技术 作者:程序员小钟同学 时间: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 YanleiXiafeipin(metaclass=ABCMeta):

    # 定义抽象方法
    @abstractmethod
    def make(self):
        pass


# 中华烟
class QinghuaYan(YanleiXiafeipin):
    def make(self):
        print("中华烟-消费品-开始生产")
        return self


# 红塔山
class HongTashanYan(YanleiXiafeipin):
    def make(self):
        print("红塔山-消费品-开始生产")
        return self


# ===========================================
# 食盐--消费品抽象类
class ShiyongYanXiafeipin(metaclass=ABCMeta):

    # 定义抽象方法
    @abstractmethod
    def make(self):
        pass


# 鲁晶盐
class Lujingyan(ShiyongYanXiafeipin):
    def make(self):
        print("鲁晶盐-消费品-开始生产")
        return self


# 淮盐
class Huaiyan(ShiyongYanXiafeipin):
    def make(self):
        print("红塔山-消费品-开始生产")
        return self


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

    # 卖烟
    @abstractmethod
    def sell_YanleiXiafeipin_product(self, objprodeuct=None, num=1):
        pass

    # 卖盐
    @abstractmethod
    def sell_ShiyongYanXiafeipin_product(self, objprodeuct=None, num=1):
        pass


# A工厂类--主营业务是销售中华烟和鲁晶盐
class AFactoryShop(FactoryShopMetaclass):

    # 卖中华烟
    def sell_YanleiXiafeipin_product(self, objprodeuct='QinghuaYan', num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出中华烟了num:" + str(len(product))

    # 卖鲁晶盐
    def sell_ShiyongYanXiafeipin_product(self, objprodeuct='Lujingyan', num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出鲁晶盐了num:" + str(len(product))


# B工厂类--主营业务是销售红塔山和淮盐
class BFactoryShop(FactoryShopMetaclass):

    # 卖红塔山
    def sell_YanleiXiafeipin_product(self, objprodeuct='HongTashanYan', num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出红塔山了num:" + str(len(product))

    # 卖淮盐
    def sell_ShiyongYanXiafeipin_product(self, objprodeuct='Huaiyan', num=1):
        product = [eval(objprodeuct)().make() for i in range(0, num)]
        return "卖出淮盐了num:" + str(len(product))


if __name__ == '__main__':
    # print( globals())
    # 开始有人光顾商店了,有人说要烟,冰激凌,食盐,我开始问工厂索要对象
    print("***" * 20)
    print('问A烟工厂要3包中华烟:', AFactoryShop().sell_YanleiXiafeipin_product(num=3))
    print("-" * 10)
    print('问A烟工厂要2包鲁晶盐:', AFactoryShop().sell_ShiyongYanXiafeipin_product(num=3))
    print("***" * 20)
    print('问B烟工厂要4包红塔山:', BFactoryShop().sell_YanleiXiafeipin_product(num=4))
    print("-" * 10)
    print('问B烟工厂要1包淮盐:', BFactoryShop().sell_ShiyongYanXiafeipin_product(num=1))


输出结果:

************************************************************
中华烟-消费品-开始生产
中华烟-消费品-开始生产
中华烟-消费品-开始生产
问A烟工厂要3包中华烟: 卖出中华烟了num:3
----------
鲁晶盐-消费品-开始生产
鲁晶盐-消费品-开始生产
鲁晶盐-消费品-开始生产
问A烟工厂要2包鲁晶盐: 卖出鲁晶盐了num:3
************************************************************
红塔山-消费品-开始生产
红塔山-消费品-开始生产
红塔山-消费品-开始生产
红塔山-消费品-开始生产
问B烟工厂要4包红塔山: 卖出红塔山了num:4
----------
红塔山-消费品-开始生产
问B烟工厂要1包淮盐: 卖出淮盐了num:1

上面的代码中,

  • AFactoryShop和BFactoryShop是抽象工厂FactoryShopMetaclass的实现,仅负责具体多个产品创建

优点:

  • 每个工厂实现类,负责组合更多的产品实例创建
  • 便于产品出厂一致性

缺点:

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

个人其他博客地址

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

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

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

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


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

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

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111698