设计模式--第十八章 抽象工厂模式

抽象工厂模式是一种设计模式,用于在不指定具体类的情况下创建一系列相关或依赖的对象。它适用于存在多个产品系列且每个系列有相同子分类的情况,如不同数据库管理系统中的表。该模式通过抽象工厂类定义产品创建的接口,具体工厂实现这些接口来生成特定系列的产品。优点在于易于交换产品系列,但当产品分类过多时会变得复杂。常见应用场景包括系统中有多个产品族,且每次只使用其中一族。
摘要由CSDN通过智能技术生成

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们的具体类。

抽象工厂模式适用于有多个系列且每个系列有相同子分类的产品。

比如,为了适应不同数据库管理系统的需求。这时,需要考虑到使用sql server和access数据库管理系统。不同的数据库就是多个系列。数据库中不同的表,对应着相同子分类的产品。

2. UML类图

抽象工厂模式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 设计要点

抽象工厂方法模式中有两个要点:

  1. 抽象工厂类里面应包含所有产品创建的抽象方法,且其子类具体工厂,实现产品创建的抽象方法,返回对应的产品对象;
  2. 不同的产品有不同的产品基类,具体的产品类型继承于产品基类;

4.2 优缺点

  1. 优点
    • 解决了具有二级分类的产品的创建。
    • 易于交换产品系列,抽象工厂模式只需要改变具体工厂即可使用不同的产品配置。
    • 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
  2. 缺点
    • 如果产品的分类超过二级,如三级甚至更多级,抽象工厂模式将会变得非常臃肿。
    • 不能解决产品有多种分类、多种组合的问题。

5. 应用场景

  1. 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  2. 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值