抽象工厂模式

简介: 抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象,而无需指定具体类。它通过抽象工厂和产品族的结构,提升系统封装性与扩展性,适用于多产品族场景,如UI组件或数据库连接,增强代码灵活性与可维护性。(238字)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一���接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这种模式常用于需要创建多个家族产品的场景,比如不同风格的 UI 组件、不同类型的数据库连接等。

  1. 抽象工厂模式的结构
    抽象工厂模式通常包含以下几个角色:

抽象工厂(Abstract Factory):声明创建抽象产品的方法。
具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品的实例。
抽象产品(Abstract Product):定义产品的接口。
具体产品(Concrete Product):实现抽象产品接口的具体类。

  1. 抽象工厂模式的 UML 图
    plaintext
    +---------------------+
    |   AbstractFactory    |
    +---------------------+
    | + create_product_a() |
    | + create_product_b() |
    +---------------------+
           / \
            |
    
    +----------+----------+
    | |
    +-------------------+ +-------------------+
    | ConcreteFactoryA | | ConcreteFactoryB |
    +-------------------+ +-------------------+
    | + create_product_a() | | + create_product_a() |
    | + create_product_b() | | + create_product_b() |
    +-------------------+ +-------------------+
    | |
    v v
    +-------------------+ +-------------------+
    | ConcreteProductA1 | | ConcreteProductB1 |
    +-------------------+ +-------------------+
    | | | |
    +-------------------+ +-------------------+
  2. 抽象工厂模式的实现
    以下是一个 Python 中抽象工厂模式的简单示例:

3.1 定义抽象产品
python
from abc import ABC, abstractmethod

class AbstractProductA(ABC):
@abstractmethod
def useful_function_a(self) -> str:
pass

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

@abstractmethod
def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
    pass

3.2 实现具体产品
python
class ConcreteProductA1(AbstractProductA):
def useful_function_a(self) -> str:
return "Result of ConcreteProductA1"

class ConcreteProductA2(AbstractProductA):
def useful_function_a(self) -> str:
return "Result of ConcreteProductA2"

class ConcreteProductB1(AbstractProductB):
def useful_function_b(self) -> str:
return "Result of ConcreteProductB1"

def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
    result = collaborator.useful_function_a()
    return f"Result of ConcreteProductB1 collaborating with ({result})"

class ConcreteProductB2(AbstractProductB):
def useful_function_b(self) -> str:
return "Result of ConcreteProductB2"

def another_useful_function_b(self, collaborator: AbstractProductA) -> str:
    result = collaborator.useful_function_a()
    return f"Result of ConcreteProductB2 collaborating with ({result})"

3.3 定义抽象工厂
python
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self) -> AbstractProductA:
pass

@abstractmethod
def create_product_b(self) -> AbstractProductB:
    pass

3.4 实现具体工厂
python
class ConcreteFactoryA(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA1()

def create_product_b(self) -> AbstractProductB:
    return ConcreteProductB1()

class ConcreteFactoryB(AbstractFactory):
def create_product_a(self) -> AbstractProductA:
return ConcreteProductA2()

def create_product_b(self) -> AbstractProductB:
    return ConcreteProductB2()

3.5 使用抽象工厂
python
def client_code(factory: AbstractFactory) -> None:
product_a = factory.create_product_a()
product_b = factory.create_product_b()

print(product_b.useful_function_b())
print(product_b.another_useful_function_b(product_a))

if name == "main":
print("Client: Testing client code with the first factory:")
factory_a = ConcreteFactoryA()
client_code(factory_a)

print("\nClient: Testing client code with the second factory:")
factory_b = ConcreteFactoryB()
client_code(factory_b)
  1. 抽象工厂模式的优缺点
    优点
    封装性:将产品的创建过程封装在工厂类中,客户端不需要关心具体产品的实现。
    易于扩展:可以轻松添加新产品或新的工厂,而不影响现有代码。
    适用跨产品族的情况:能够确保产品之间的兼容性,以便同一客户使用同一产品族的产品。
    缺点
    复杂性:引入了更多的类和层次结构,可能会增加系统的复杂度。
    不易理解:对于简单场景,抽象工厂模式可能显得过于复杂。
  2. 何时使用抽象工厂模式
    当系统需要独立于其产品的创建、组合和表示时。
    当系统需要使用多个产品族中的产品时。
    当产品的变化需要同时改变多个类时。
  3. 总结
    抽象工厂模式是一种强大的设计模式,适合用于需要创建多个相关产品的场景。它通过抽象化产品的创建过程,提高了代码的灵活性和可维护性。在实际开发中,根据需求合理使用抽象工厂模式,有助于构建更加清晰和可扩展的系统。
相关文章
|
5月前
|
JavaScript 前端开发 API
Vue3 从入门到实战
Vue3 从入门到实战,涵盖组合式 API、响应式数据、组件化开发与生命周期等核心内容。提供可直接运行的代码示例,零基础快速上手,助力高效构建现代化前端应用。
|
5月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
5月前
|
存储 JSON JavaScript
JSON 快速上手指南
JSON是一种轻量级数据交换格式,语法严格,键名需双引号、值类型有限,支持跨语言解析。本文详解其语法规则、与JS对象区别、序列化/解析方法(stringify/parse)、实战应用及常见避坑技巧,助你快速掌握JSON核心技能。
|
5月前
|
JavaScript 前端开发 Java
Bootstrap5 快速上手指南
Bootstrap5 快速上手指南:告别 jQuery,拥抱原生 JS!新增 xxL 断点与 RTL 支持,优化栅格系统与组件样式。提供 CDN 引入、核心布局、常用组件及完整博客实例,零基础也能快速搭建美观响应式博客,含按钮、卡片、导航栏、表单等实战代码,即拷即用。
Bootstrap5 快速上手指南
|
5月前
|
JavaScript 前端开发 API
Vue.js 快速上手指南
Vue.js 是轻量级渐进式前端框架,核心聚焦视图层,上手简单、生态丰富。本文提供可直接复制的快速入门指南,涵盖 Vue3 组合式 API、响应式数据、指令、组件化、生命周期及 Axios 异步请求等实战内容,附完整示例与避坑提示,零基础也能快速搭建交互式页面,助力高效开发。
|
5月前
|
SQL 关系型数据库 MySQL
事务隔离级别
MySQL提供四种事务隔离级别:读未提交、读已提交、可重复读和串行化,用于平衡数据一致性与性能。本文详解各级别特性及适用场景,并介绍在阿里云RDS中通过SQL命令或控制台配置的方法,助您优化数据库表现。
|
5月前
|
自然语言处理 关系型数据库 MySQL
MySQL 全文索引
MySQL全文索引支持对CHAR、VARCHAR、TEXT字段进行高效文本搜索,适用于文章、评论等长文本。通过MATCH()与AGAINST()实现自然语言或布尔模式查询,支持分词、停用词过滤和最小词长设置。可创建于建表时或后期添加,适用于搜索引擎、CMS、电商等场景,提升关键词检索效率,但需权衡增删改开销与索引维护成本。(238字)
|
5月前
|
JSON JavaScript 前端开发
Node.js 快速上手指南
Node.js 是基于 Chrome V8 引擎的 JavaScript 运行时,让 JS 脱离浏览器运行在服务端。支持异步 I/O、跨平台,适用于构建后端 API、CLI 工具与全栈应用。本指南涵盖安装、核心模块(fs、http、path、events)、NPM 包管理、Express 实战及文件上传示例,零基础也能快速上手,掌握 Node.js 核心开发技能。
|
5月前
|
监控 关系型数据库 MySQL
MySQL 联合索引
联合索引是MySQL中提升多列查询性能的关键技术,由多个列组成,遵循最左前缀原则。合理设计索引顺序可显著加速查询,避免全表扫描。需结合实际查询需求创建,避免冗余,配合EXPLAIN分析执行计划,优化数据库性能。(238字)
|
5月前
|
SQL 存储 关系型数据库
MySQL 高频面试题
本课程深度解析阿里MySQL高频面试题,涵盖底层原理、索引优化、性能调优与故障排查四大核心模块。结合阿里实战场景,精讲MVCC、B+树、事务ACID、死锁处理、慢SQL定位、分库分表等关键技术点,提供可落地的优化方案与标准答案,助力掌握“原理+实战”双能力,精准应对高并发、大数据量下的数据库挑战,适合中高级开发者冲击大厂offer。