抽象工厂模式

简介: 抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象,而无需指定具体类。它通过抽象工厂和产品族的结构,提升系统封装性与扩展性,适用于多产品族场景,如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. 总结
    抽象工厂模式是一种强大的设计模式,适合用于需要创建多个相关产品的场景。它通过抽象化产品的创建过程,提高了代码的灵活性和可维护性。在实际开发中,根据需求合理使用抽象工厂模式,有助于构建更加清晰和可扩展的系统。
相关文章
|
索引
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
14430 2
|
4月前
|
人工智能 编解码 Java
Harness Engineering:耗时一周,我是如何将应用的AI Coding率提升至90%的
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
1398 7
|
9月前
|
JavaScript 前端开发 API
Vue3 从入门到实战
Vue3 从入门到实战,涵盖组合式 API、响应式数据、组件化开发与生命周期等核心内容。提供可直接运行的代码示例,零基础快速上手,助力高效构建现代化前端应用。
|
9月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
9月前
|
缓存 JavaScript 前端开发
jQuery 快速上手指南
jQuery是全球最流行的JavaScript库,以“写更少代码,做更多事”为核心,封装原生JS复杂操作,兼容主流浏览器。本指南含快速引入、核心语法、常用功能与实战示例,支持直接复制粘贴至博客,零基础也能快速上手,涵盖选择器、DOM操作、事件、动画、AJAX及性能优化技巧,助力高效开发前端交互页面。
|
9月前
|
前端开发 Java 关系型数据库
|
9月前
|
JavaScript 前端开发 Java
Bootstrap5 快速上手指南
Bootstrap5 快速上手指南:告别 jQuery,拥抱原生 JS!新增 xxL 断点与 RTL 支持,优化栅格系统与组件样式。提供 CDN 引入、核心布局、常用组件及完整博客实例,零基础也能快速搭建美观响应式博客,含按钮、卡片、导航栏、表单等实战代码,即拷即用。
Bootstrap5 快速上手指南
|
机器学习/深度学习 人工智能 JSON
知识蒸馏方法探究:Google Distilling Step-by-Step 论文深度分析
大型语言模型(LLM)的发展迅速,从简单对话系统进化到能执行复杂任务的先进模型。然而,这些模型的规模和计算需求呈指数级增长,给学术界和工业界带来了挑战。为解决这一问题,知识蒸馏技术应运而生,旨在将大型模型的知识转移给更小、更易管理的学生模型。Google Research 提出的“Distilling Step-by-Step”方法不仅减小了模型规模,还通过提取推理过程使学生模型在某些任务上超越教师模型。该方法通过多任务学习框架,训练学生模型同时预测标签和生成推理过程,从而实现更高效、更智能的小型化模型。这为资源有限的研究者和开发者提供了新的解决方案,推动了AI技术的普及与应用。
979 19
知识蒸馏方法探究:Google Distilling Step-by-Step 论文深度分析
|
9月前
|
XML JSON 前端开发
AJAX 快速上手指南
本文介绍AJAX核心原理及原生JS、jQuery、Axios实现方式,涵盖请求流程、跨域解决方案与实战示例,助你零基础快速掌握无刷新数据交互技术。
|
9月前
|
存储 数据采集 关系型数据库
MySQL 唯一索引
MySQL唯一索引确保列值唯一,支持NULL(非NOT NULL列),可自动创建于主键。它保障数据完整性、提升查询性能,支持单列与复合唯一索引。创建可在建表或用ALTER添加,但会增加存储开销并影响写入性能。可用SHOW INDEX查看,DROP INDEX删除。合理使用有助于数据质量与查询优化。

热门文章

最新文章