Python设计模式-抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory)
抽象工厂是对工厂模式进行了进一步封装(抽象),即,如果有多个功能类似的工厂,通过抽象工厂,来创建这些工厂。
抽象工厂方法:创建一系列相关或相互依赖抽象出来的的对象接口Interface,不需要具体指明实例化A类或B类
优点:
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
示例
# 一个不同格式文件读取的例子
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
本文来自博客园,作者:坦先生的AI资料室,转载请注明原文链接:https://www.cnblogs.com/yushengchn/p/16478391.html

浙公网安备 33010602011771号