创建型设计模式 - 抽象工厂模式 - JAVA

创建型设计模式 - 抽象工厂设计模式

    • 一. 简介
    • 二. 列子
      • 2.1 定义电脑的抽象类和子类
      • 2.2 定义抽象工厂类和其实现类
      • 2.3 测试
    • 三. 抽象工厂设计模式的好处
    • 四. 抽象工厂模式的案例

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

抽象工厂设计模式是创建模式之一。抽象工厂模式 几乎与 工厂模式 相似,只是它更像工厂的工厂

一. 简介

看本片文章前,可以先看 工厂设计模式,您会注意到我们有一个 Factory 类。该工厂类根据提供的输入返回不同的子类,工厂类使用 if-else 或 switch 语句来实现此目的。在抽象工厂模式中,我们摆脱了 if-else 块,每个子类都有一个工厂类,然后设置一个抽象工厂类工厂类去实现这个抽象工厂。工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。大白话可能没办法讲清楚,接下来会通过代码解释,这样就能很容易掌握和理解工厂模式抽象工厂模式之间的细微差别。

二. 列子

就像我们的工厂模式案例一样,我们将使用相同的超类和子类

假如我们要做一个电脑购买系统,里面有台式机 和笔记本 ,他们是 电脑(Computer)类别,在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。可是台式机又有 华为台式机 (HuaWeiPc)小米台式机(XiaoMiPc) , 笔记本又有 华为笔记本(HuaWeiLaptop)小米笔记本(XiaoMiLaptop)台式机和笔记本是一个等级,华为和小米又是一个等级,这种多态性就适合使用抽象工厂设计模式,类图如下:

image-20231227233927261

这里设置一个抽象工厂(ComputerAbstractFactory), 台式机 (PcFactory),笔记本(LaptopFactory)这两个工厂实现他,创建一个工厂(ComputerFactory)给客户端提供创建子类的入口点

2.1 定义电脑的抽象类和子类

电脑抽象类

/**
 * 电脑抽象类
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:09
 */
public abstract class Computer {

    /**
     * 内存抽象方法
     * @return string
     */
    public abstract String memory();

    /**
     * 磁盘抽象方法
     * @return string
     */
    public abstract String disk();

    @Override
    public String toString() {
        return "内存:" + memory() + "  " + "磁盘:" + disk();
    }
}

华为台式机

/**
 * 华为台式机
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:22
 */
public class HuaWeiPc extends Computer {
    private final String memory;

    private final String disk;

    public HuaWeiPc(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

小米台式机

/**
 * 小米台式机
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:23
 */
public class XiaoMiPc extends Computer{

    private final String memory;
    private final String disk;

    public  XiaoMiPc(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

华为笔记本

/**
 * 华为笔记本
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:26
 */
public class HuaWeiLaptop extends Computer{

    private final String memory;
    private final String disk;
    public HuaWeiLaptop(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }
    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

小米笔记本

/**
 * 小米笔记本
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:30
 */
public class XiaoMiLaptop extends Computer{

    private final String memory;
    private final String disk;

    public XiaoMiLaptop(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

2.2 定义抽象工厂类和其实现类

电脑抽象工厂

创建一个接口或者抽象类都可以

/**
 * 电脑抽象工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 22:53
 */
public interface  ComputerAbstractFactory {
    /**
     * 创建华为电脑接口
     */
    public Computer createHuaWeiComputer();

    /**
     * 创建小米电脑接口
     */
    public Computer createXiaoMiComputer();
}

台式机工厂

/**
 * 台式机工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 21:57
 */
public class PcFactory implements ComputerAbstractFactory{

    private final String memory;

    private final String disk;

    public PcFactory(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public Computer createHuaWeiComputer() {
        return new HuaWeiPc(memory, disk);
    }

    @Override
    public Computer createXiaoMiComputer() {
        return new XiaoMiPc(memory, disk);
    }
}

笔记本工厂

/**
 * 笔记本工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 23:08
 */
public class LaptopFactory implements ComputerAbstractFactory{

    private final String memory;
    private final String disk;

    public LaptopFactory(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public Computer createHuaWeiComputer() {
        return new HuaWeiLaptop(memory, disk);
    }

    @Override
    public Computer createXiaoMiComputer() {
        return new XiaoMiLaptop(memory, disk);
    }
}

2.3 测试

/**
 * 测试
 *
 * @author chenyunzhi
 * @date 2023/12/27 23:25
 */
public class TestDesignPatterns {
    public static void main(String[] args) {
        testDesignPatterns();
    }

    private static void testDesignPatterns() {
        Computer huaWeiComputer = ComputerFactory.getHuaWeiComputer(new PcFactory("32 GB", "1 TB"));
        System.out.println("华为pc电脑 = " + huaWeiComputer);
        Computer xiaoMiComputer = ComputerFactory.getXiaoMiComputer(new PcFactory("16 GB", "512 GB"));
        System.out.println("小米pc电脑 = " + xiaoMiComputer);

        Computer huaWeiComputer1 = ComputerFactory.getHuaWeiComputer(new LaptopFactory("8 GB", "1 TB"));
        System.out.println("华为笔记本电脑 = " + huaWeiComputer1);
        Computer xiaoMiComputer1 = ComputerFactory.getXiaoMiComputer(new LaptopFactory("4 GB", "512 GB"));
        System.out.println("小米笔记本电脑 = " + xiaoMiComputer1);
    }
}

image-20231228001553538

三. 抽象工厂设计模式的好处

  • 抽象工厂模式是“工厂的工厂”,可以很容易地扩展以容纳更多的产品,例如我们可以添加另一个子类 ipad 和工厂 ipadFactory。
  • 抽象工厂模式是健壮的,并且避免了工厂模式的条件逻辑。

四. 抽象工厂模式的案例

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 安装 mysql【使用yum源进行安装】

配置yum 源 首先,去到mysql网站,找到它的rpm的资源包 “mysql80-community-release-el9-5.noarch.rpm” 我们将其下载下来,然后配置yum源(下面两种方式二选一即可) ① 使用xftp传输,然后配置yum源 rpm …

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio,Visual Studio 2010旗舰版下载链接:点此…

Qt基础之四十五:Qt国际化(I18N)

国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),这种奇葩的缩写方式,让我想起了NBA球星“字母哥”。 下面看下Qt实现的动态语言切换效果。 一.效果 二.源码 QHSettingDialog.h #ifndef QHSETTINGDIALOG_H #define QHSETTINGDIALOG_H#…

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN),因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性,在多个站点之间交付 IP 流量或数据包,拥有亚太地区最大的 IP 骨干网。 1,保证正常运行时间,在网络链路发…

修改一个VC++访问数据库源码

下载一个VC6访问数据库的源码;修改; 打开工程先出现下图错误; 根据资料,出现此错误,解决方法: 1.如果用户不需要在 WizardBar,请关闭该的 WizardBar 并重新启动 Visual C++6.0。 如果但是,您想访问 WizardBar 功能,请关闭受影响的工作区之前关闭所有窗口。 2.重新生…

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。 设计模式有三大分类:创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat,所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用,其中关于文档如何进行分块的详细,可以参考笔者的另几篇文章: 大模型RAG 场景、数据、应用难点与解决(四)R…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传,但是自己搭文件服务器会有很多运维的问题,比如磁盘满了要扩容…

VMware安装RHEL9.0版本Linux系统

最近在学习Linux,安装了Red Hat Enterprise Linux 的 9.0版本,简称RHEL9.0。RHEL9.0是Red Hat公司发布的面向企业用户的Linux操作系统的最新版本。我把它安装在虚拟机VMware里来减少电脑性能占用,也防止系统炸搞得我后面要重装。安装RHEL9.0还…

【Unity入门】MenuItem 和 ContextMenu 的使用方法

目录 一、ContextMenu描述使用示例ContextMenuItem使用示例 二、MenuItem描述使用示例 三、MenuItem 和 ContextMenu 的区别 一、ContextMenu 描述 ContextMenu 属性用于向上下文菜单添加命令。 在该附加脚本的 Inspector 中,当用户选择该上下文菜单时&#xff0c…

FA组件详解

1、了解FA核心组件以及功能 (1)TC(Thin Client:瘦终端):就是类似于机顶盒的一个小盒子,里面有CPU、内存、USB、MIC、HDMI等接口,可以理解为小型电脑,但是它里面是没有操作…

Unity 新版 Meta XR SDK 无法导入解决方法

文章目录 📕教程说明📕新版 SDK 说明📕从 Meta 官网导入开发包⭐依赖包⭐如何导入⭐导入后包存放在哪里了?⭐场景样例文件去哪了? 此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatia…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架,它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建,解决了 Web 开发的大部分麻烦,因此您可以专注于在编写应用程序时无需重新发…

C# vs报错 id为XX的进程当前未运行

报错原因:虚拟目录端口被占用 解决方法:重新配置新的目录端口就行 1、选择项目属性 2、更改端口号,点击创建虚拟目录 3、重新生成项目

使用python快速开发与PDF文档对话的Gemini聊天机器人

检索增强生成(Retrieval-augmented generation,RAG)使得我们可以让大型语言模型(LLMs)访问外部知识库数据(如pdf,word、text等),从而让人们可以更加方便的通过LLM来学习外部数据的知识。今天我们将利用之前学习到的RAG方法,谷歌Gemini模型和l…

「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分

在上一篇文章中,我们看到了实现分布式事务的一些挑战,以及如何使用Event / Choreography方法实现Saga的模式。在本文中,我们将讨论如何通过使用另一种类型的Saga实现(称为Command或Orchestration)来解决一些问题&#…

Ps:三角形工具

三角形工具 Triangle Tool可以绘制三角形形状(矢量形状,或者是基于像素的形状)和路径(形状轮廓)。 快捷键:U ◆ ◆ ◆ 常用操作方法与技巧 1、一般使用拖拽的方式绘制三角形。也可直接在画布上点击&#…

【2023】hadoop基础介绍

💻目录 Hadoop组成HDFSHDFS操作HDFS分布式文件存储NameNode元数据数据读写流程 YARN和MapReduceMapReduce:分布式计算YARN:资源管控调度YARN架构提交任务到**YARN中运行** Hadoop组成 hadoop安装教程可以看我这篇文章> 🍅hado…