Python设计模式-抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory)

抽象工厂是对工厂模式进行了进一步封装(抽象),即,如果有多个功能类似的工厂,通过抽象工厂,来创建这些工厂。

抽象工厂方法:创建一系列相关或相互依赖抽象出来的的对象接口Interface,不需要具体指明实例化A类或B类

优点:
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

返回 Python设计模式-outline

示例

# 一个不同格式文件读取的例子
import json
import pickle
from abc import abstractmethod

class BaseFileHandler:
    @abstractmethod
    def load_from_fileobj(self, file, **kwargs):
        pass
    
    @abstractmethod
    def dump_to_fileobj(self, obj, file, **kwargs):
        pass

class JsonHandler(BaseFileHandler):
    def load_from_fileobj(self, file):
        return json.load(file)

    def dump_to_fileobj(self, obj, file, **kwargs):
        json.dump(obj, file, **kwargs)

class PickleHandler(BaseFileHandler):
    def load_from_fileobj(self, file, **kwargs):
        return pickle.load(file, **kwargs)

    def dump_to_fileobj(self, obj, file, **kwargs):
        kwargs.setdefault('protocol', 2)
        pickle.dump(obj, file, **kwargs)

# 抽象工厂
class FileHandler:
    def __init__(self, classname=None):
        self.classname = classname
  
    def load_from_fileobj(self, file, **kwargs):
        self.classname().load_from_fileobj(self, file, **kwargs)
    
    def dump_to_fileobj(self, obj, file, **kwargs):
        self.classname().dump_to_fileobj(self, file, **kwargs)  

工厂和抽象工厂的联系和区别

工厂方法实例化的类在接口方法里已经通过字典方式例举出来了,也就是不是实例化A就是B,
但是抽象工厂实例化的类未知,可以在抽象接口类里传入A或者B,也可以新建一个C类传入。

工厂方法 抽象工厂
开放一个创建对象的方法 包含一个或多个工厂方法来创建一系列对象
使用继承和子类来决定创建什么对象 实用组合将创建对象的任务交给其他类
创建一个产品 创建相关系列(一群组)产品

ref

https://zhuanlan.zhihu.com/p/56202148
https://blog.csdn.net/likunkun__/article/details/93884508

posted @   坦先生的AI资料室  阅读(380)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示