第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录
1. 核心思想
提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们的具体类。
抽象工厂模式适用于有多个系列且每个系列有相同子分类的产品。
比如,为了适应不同数据库管理系统的需求。这时,需要考虑到使用sql server和access数据库管理系统。不同的数据库就是多个系列。数据库中不同的表,对应着相同子分类的产品。
2. UML类图
3. 框架代码
from abc import ABC, abstractmethod
import sys
class ProductA(ABC):
@abstractmethod
def feature(self):
pass
class ProductAImplA(ProductA):
def feature(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class ProductAImplB(ProductA):
def feature(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class ProductB(ABC):
@abstractmethod
def feature(self):
pass
class ProductBImplA(ProductB):
def feature(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class ProductBImplB(ProductB):
def feature(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class AbstractFactory(ABC):
@abstractmethod
def createProductA(self):
pass
@abstractmethod
def createProductB(self):
pass
class FactoryImplA(AbstractFactory):
def createProductA(self)->ProductA:
return ProductAImplA()
def createProductB(self)->ProductB:
return ProductAImplB()
class FactoryImplB(AbstractFactory):
def createProductA(self)->ProductA:
return ProductBImplA()
def createProductB(self)->ProductB:
return ProductBImplB()
if __name__ == "__main__":
# 采用反射的机制,避免了需要换工厂时需要全部修改使用的工厂类,在反射机制中,只需要修改classPath变量即可
from importlib import import_module
classPath = "abstract_factory_pattern.FactoryImplA"
index = classPath.rfind(".")
modulePath,className = classPath[:index],classPath[index+1:]
factory:FactoryImplA = getattr(import_module("abstract_factory_pattern"),className)()
pa = factory.createProductA()
pb = factory.createProductB()
pa.feature()
pb.feature()
4. 模型说明
4.1 设计要点
抽象工厂方法模式中有两个要点:
- 抽象工厂类里面应包含所有产品创建的抽象方法,且其子类具体工厂,实现产品创建的抽象方法,返回对应的产品对象;
- 不同的产品有不同的产品基类,具体的产品类型继承于产品基类;
4.2 优缺点
- 优点
- 解决了具有二级分类的产品的创建。
- 易于交换产品系列,抽象工厂模式只需要改变具体工厂即可使用不同的产品配置。
- 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
- 缺点
- 如果产品的分类超过二级,如三级甚至更多级,抽象工厂模式将会变得非常臃肿。
- 不能解决产品有多种分类、多种组合的问题。
5. 应用场景
- 系统中有多于一个的产品族,而每次只使用其中某一产品族。
- 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。