【设计模式】创建型模式——抽象工厂模式

2024-08-30 00:12

本文主要是介绍【设计模式】创建型模式——抽象工厂模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

抽象工厂模式

  • 1. 模式定义
  • 2. 模式结构
  • 3. 实现
    • 3.1 实现抽象产品接口
    • 3.2 定义具体产品
    • 3.3 定义抽象工厂接口
    • 3.4 定义具体工厂
    • 3.5 客户端代码
  • 4. 模式分析
    • 4.1 抽象工厂模式退化为工厂方法模式
    • 4.2 工厂方法模式退化为简单工厂模式
  • 5. 模式特点
    • 5.1 优点
    • 5.2 缺点
  • 6. 适用场景
    • 6.1 需要创建一组相关或相互依赖的对象
    • 6.2 系统不应依赖于产品类的具体实现
    • 6.3 需要提供一组产品的多种变体
  • 7. 模式扩展
    • 7.1 “开闭原则”的倾斜性
      • 7.1.1 增加产品族:
      • 7.1.2 增加产品等级结构:


1. 模式定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

2. 模式结构

抽象工厂模式包含如下角色:

  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂
  • AbstractProduct:抽象产品
  • Product:具体产品
    在这里插入图片描述

3. 实现

3.1 实现抽象产品接口

首先,定义两个抽象产品接口:Button 和 TextBox。

package mainimport "fmt"// Button 是按钮的抽象接口
type Button interface {Render()
}// TextBox 是文本框的抽象接口
type TextBox interface {Render()
}

3.2 定义具体产品

这些类实现了抽象产品接口。

// WindowsButton 是 Windows 风格的按钮
type WindowsButton struct{}func (b *WindowsButton) Render() {fmt.Println("Rendering Windows Button")
}// MacButton 是 Mac 风格的按钮
type MacButton struct{}func (b *MacButton) Render() {fmt.Println("Rendering Mac Button")
}// WindowsTextBox 是 Windows 风格的文本框
type WindowsTextBox struct{}func (t *WindowsTextBox) Render() {fmt.Println("Rendering Windows TextBox")
}// MacTextBox 是 Mac 风格的文本框
type MacTextBox struct{}func (t *MacTextBox) Render() {fmt.Println("Rendering Mac TextBox")
}

3.3 定义抽象工厂接口

声明了创建一组相关对象的方法。

// GUIFactory 是 GUI 工具包的抽象工厂接口
type GUIFactory interface {CreateButton() ButtonCreateTextBox() TextBox
}

3.4 定义具体工厂

这些类实现了抽象工厂接口。

// WindowsFactory 是 Windows 风格的 GUI 工具包工厂
type WindowsFactory struct{}func (f *WindowsFactory) CreateButton() Button {return &WindowsButton{}
}func (f *WindowsFactory) CreateTextBox() TextBox {return &WindowsTextBox{}
}// MacFactory 是 Mac 风格的 GUI 工具包工厂
type MacFactory struct{}func (f *MacFactory) CreateButton() Button {return &MacButton{}
}func (f *MacFactory) CreateTextBox() TextBox {return &MacTextBox{}
}

3.5 客户端代码

使用抽象工厂模式创建一组相关对象。

func main() {var factory GUIFactory// 可以根据需要选择不同的工厂factory = &WindowsFactory{}// factory = &MacFactory{}button := factory.CreateButton() //Rendering Windows ButtontextBox := factory.CreateTextBox() //Rendering Windows TextBoxbutton.Render() //Rendering Mac ButtontextBox.Render() //Rendering Mac TextBox
}

4. 模式分析

4.1 抽象工厂模式退化为工厂方法模式

  • 条件: 每个具体工厂类只创建一个产品对象,即只存在一个产品等级结构。
  • 结果: 抽象工厂模式退化为工厂方法模式,因为不再需要创建多个相关的产品对象。

4.2 工厂方法模式退化为简单工厂模式

  • 条件: 抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的方法设计为静态方法。
  • 结果: 工厂方法模式退化为简单工厂模式,因为所有产品对象的创建都由一个统一的工厂类负责。

5. 模式特点

5.1 优点

  • 确保同一产品族的对象一起工作。
  • 客户端不需要知道每个对象的具体类,简化了代码。

5.2 缺点

扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。

6. 适用场景

6.1 需要创建一组相关或相互依赖的对象

当系统需要创建一组相关或相互依赖的对象时,抽象工厂模式可以确保这些对象的一致性和兼容性。例如,创建不同风格的 GUI 组件(按钮、文本框等)。

6.2 系统不应依赖于产品类的具体实现

当系统不应依赖于产品类的具体实现,而是通过接口来操作对象时,抽象工厂模式可以提供一个统一的接口来创建对象。

6.3 需要提供一组产品的多种变体

当系统需要提供一组产品的多种变体(如不同平台的 GUI 组件),并且客户端代码需要透明地使用这些变体时,抽象工厂模式是一个合适的选择。

7. 模式扩展

7.1 “开闭原则”的倾斜性

7.1.1 增加产品族:

  • 支持良好: 当需要增加新的产品族(例如,不同风格的按钮和文本框)时,只需添加新的具体工厂类和相应的产品类,而无需修改现有的代码。这符合开闭原则,因为系统对扩展开放,对修改封闭。

7.1.2 增加产品等级结构:

  • 支持不佳: 当需要增加新的产品等级结构(例如,新增一种产品类型如复选框)时,必须修改抽象工厂接口和所有具体工厂类,添加创建新产品的方法。这违反了开闭原则,因为需要修改现有的代码。

这篇关于【设计模式】创建型模式——抽象工厂模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119244

相关文章

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一