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

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

相关文章

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多