抽象工厂模式

简介: 抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象,而无需指定具体类。它通过抽象工厂和产品族的结构,提升系统封装性与扩展性,适用于多产品族场景,如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. 总结
    抽象工厂模式是一种强大的设计模式,适合用于需要创建多个相关产品的场景。它通过抽象化产品的创建过程,提高了代码的灵活性和可维护性。在实际开发中,根据需求合理使用抽象工厂模式,有助于构建更加清晰和可扩展的系统。
相关文章
|
20天前
|
人工智能 编解码 Java
Harness Engineering:耗时一周,我是如何将应用的AI Coding率提升至90%的
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
|
索引
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
14187 2
|
6月前
|
JavaScript 前端开发 API
Vue3 从入门到实战
Vue3 从入门到实战,涵盖组合式 API、响应式数据、组件化开发与生命周期等核心内容。提供可直接运行的代码示例,零基础快速上手,助力高效构建现代化前端应用。
|
6月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
6月前
|
JavaScript 前端开发 Java
Bootstrap5 快速上手指南
Bootstrap5 快速上手指南:告别 jQuery,拥抱原生 JS!新增 xxL 断点与 RTL 支持,优化栅格系统与组件样式。提供 CDN 引入、核心布局、常用组件及完整博客实例,零基础也能快速搭建美观响应式博客,含按钮、卡片、导航栏、表单等实战代码,即拷即用。
Bootstrap5 快速上手指南
|
6月前
|
前端开发 JavaScript Java
Bootstrap4 快速上手指南
Bootstrap4 是全球流行的前端框架,基于 HTML、CSS、JS 构建,支持移动端优先与响应式布局。本文提供可直接复制的 CDN 引入方式、栅格系统、按钮、卡片、导航栏、表单等常用组件及完整博客页面实战示例,零基础也能快速上手,轻松搭建美观网页。
Bootstrap4 快速上手指南
|
6月前
|
JSON JavaScript 前端开发
Node.js 快速上手指南
Node.js 是基于 Chrome V8 引擎的 JavaScript 运行时,让 JS 脱离浏览器运行在服务端。支持异步 I/O、跨平台,适用于构建后端 API、CLI 工具与全栈应用。本指南涵盖安装、核心模块(fs、http、path、events)、NPM 包管理、Express 实战及文件上传示例,零基础也能快速上手,掌握 Node.js 核心开发技能。
|
6月前
|
SQL 存储 关系型数据库
MySQL 高频面试题
本课程深度解析阿里MySQL高频面试题,涵盖底层原理、索引优化、性能调优与故障排查四大核心模块。结合阿里实战场景,精讲MVCC、B+树、事务ACID、死锁处理、慢SQL定位、分库分表等关键技术点,提供可落地的优化方案与标准答案,助力掌握“原理+实战”双能力,精准应对高并发、大数据量下的数据库挑战,适合中高级开发者冲击大厂offer。
|
6月前
|
监控 关系型数据库 MySQL
索引失效场景(阿里高频踩坑点)
MySQL索引可显著提升查询性能,但存在多种失效场景:数据类型不匹配、索引列使用函数、LIKE以%开头、复合索引未遵循最左前缀、OR条件中部分无索引、NULL值查询、频繁更新导致索引失衡、ORDER BY/GROUP BY未用索引列、配置或版本差异及过度依赖索引。阿里等大厂高频踩坑点需特别警惕。合理设计索引并结合执行计划优化,才能保障高效查询。(238字)
|
6月前
|
消息中间件 Dubbo Java
深挖红黑树底层原理
深入解析红黑树底层原理,涵盖定义、特性、旋转与插删操作,结合Java源码实现及阿里生产实践,全面掌握高频面试与实战核心要点。

热门文章

最新文章