当前位置: 首页 > article >正文

抽象工厂模式详解

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式允许客户端使用抽象工厂接口来创建一族产品,而不必直接使用具体产品的实现类。
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
主要解决
接口选择的问题,确保同一产品族的对象一起工作,客户端不需要知道每个对象的具体类,简化了代码。
适用场景
当系统需要创建多个相关或依赖的对象,而不需要指定具体类时。
结构组成
抽象工厂模式包含以下几个主要角色:
1.  抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
2.  具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3.  抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4.  具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
代码实现
以下是一个抽象工厂模式的Python代码示例:
from abc import ABC, abstractmethod

class AbstractFactory(ABC):
    """
    The Abstract Factory interface declares a set of methods that return
    different abstract products. These products are called a family and are
    related by a high-level theme or concept.
    """
    @abstractmethod
    def create_product_a(self) -> 'AbstractProductA':
        pass
    @abstractmethod
    def create_product_b(self) -> 'AbstractProductB':
        pass

class ConcreteFactory1(AbstractFactory):
    """
    Concrete Factories produce a family of products that belong to a single
    variant. The factory guarantees that resulting products are compatible.
    """
    def create_product_a(self) -> 'AbstractProductA':
        return ConcreteProductA1()
    def create_product_b(self) -> 'AbstractProductB':
        return ConcreteProductB1()

class ConcreteFactory2(AbstractFactory):
    def create_product_a(self) -> 'AbstractProductA':
        return ConcreteProductA2()
    def create_product_b(self) -> 'AbstractProductB':
        return ConcreteProductB2()

class AbstractProductA(ABC):
    """
    Each distinct product of a product family should have a base interface.
    """
    @abstractmethod
    def useful_function_a(self) -> str:
        pass

class ConcreteProductA1(AbstractProductA):
    def useful_function_a(self) -> str:
        return "The result of the product A1."

class ConcreteProductA2(AbstractProductA):
    def useful_function_a(self) -> str:
        return "The result of the product A2."

class AbstractProductB(ABC):
    @abstractmethod
    def useful_function_b(self) -> str:
        pass

class ConcreteProductB1(AbstractProductB):
    def useful_function_b(self) -> str:
        return "The result of the product B1."

class ConcreteProductB2(AbstractProductB):
    def useful_function_b(self) -> str:
        return "The result of the product B2."

在这个例子中,AbstractFactory 定义了创建产品的方法,ConcreteFactory1 和 ConcreteFactory2 是具体的工厂实现,它们分别创建属于它们各自变体的具体产品 ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2。
优点
1.  确保同一产品族的对象一起工作。
2.  客户端不需要知道每个对象的具体类,简化了代码。
缺点
扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
使用场景
1.  QQ换皮肤时,整套皮肤一起更换。
2.  创建跨平台应用时,生成不同操作系统的程序。
抽象工厂模式通过提供一个接口来创建一系列相关或相互依赖的对象,使得客户端代码更加灵活,并且能够轻松地切换不同的产品族,而不需要修改现有的代码。


http://www.kler.cn/a/459633.html

相关文章:

  • UnityRenderStreaming使用记录(三)
  • javacript中function (res) {}与箭头函数表达式(res) =>{}的区别
  • SpringCloud源码分析-Lettue Redis
  • leetcode 面试经典 150 题:同构字符串
  • C# 设计模式(创建型模式):单例模式
  • 机器学习 学习知识点
  • 初识 Conda:一站式包管理和环境管理工具
  • Unity3D 基于GraphView实现的节点编辑器框架详解
  • es6 字符串每隔几个中间插入一个逗号
  • 【Cursor编辑器】自用经验和实操(迭代更新)
  • 【MySQL】搞懂mvcc、read view:MySQL事务原理深度剖析
  • Springboot配置文件加载顺序(含Nacos配置)
  • 自动驾驶第一股的转型迷途:图森未来赌上了AIGC
  • 论文阅读《Cross-scale multi-instance learning for pathological image diagnosis》
  • xtuoj 等式
  • python读写文件的三种做法
  • FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持
  • 【Leetcode 热题 100】17. 电话号码的字母组合
  • 【Golang 面试题】每日 3 题(九)
  • BLIP论文笔记
  • w124中药实验管理系统
  • PySide6 SQLite3 做的 电脑组装报价系统
  • 玩转OCR | 腾讯云智能结构化OCR初体验
  • 区块链期末复习3:跨链原子交换其他加密货币
  • java—网络编程TCP和UDP
  • 探索RAG(检索增强生成):三大RAG技术的特点与应用场景