3、抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)在工厂模式上添加了一个创建不同工厂的抽象接口(抽象类或接口实现),可称该接口为作“超级工厂”。在使用过程中,首先通过抽象接口创建出不同的工厂对象,然后根据不同的工厂对象创建不同的对象。

可以将工厂模式理解为针对一个产品维度进行分类,比如上述工厂模式下的苹果手机和华为手机;而抽象工厂模式针对的是多个产品维度分类,比如苹果公司既制造苹果手机也制造苹果笔记本电脑,同样,华为公司既制造华为手机也制造华为笔记本电脑。

在同一个厂商有多个维度的产品时,如果使用工厂模式,则势必会存在多个独立的工厂,这样的话,设计和物理世界是不对应的。正确的做法是通过抽象工厂模式来实现,我们可以将抽象工厂类比成厂商(苹果、华为),将通过抽象工厂创建出来的工厂类比成不同产品的生产线(手机生成线、笔记本电脑生产线),在需要生产产品时根据抽象工厂生产。

工厂模式定义了工厂方法来实现不同厂商手机的制造。可是问题来了,我们知道苹果公司和华为公司不仅制造手机,还制造电脑。如果使用工厂模式,就需要实现两个工厂类,并且这两个工厂类没有多大关系,这样的设计显然不够优雅,那么如何实现呢?使用抽象工厂就能很好地解决上述问题。我们定义一个抽象工厂,在抽象工厂中定义好要生产的产品(手机或者电脑),然后在抽象工厂的实现类中根据不同类型的产品和产品规格生产不同的产品返回给用户。UML的设计如下图:

UML的具体实现如下:

1、抽象工厂(超级工厂)

package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description: 超级工厂
 * @Date 2023/11/27 22:51
 */
public abstract class AbstractFactory {
    public abstract Phone createPhone(String brand);
    public abstract Computer createComputer(String brand);
}

2、手机接口极其实现类

package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description: 手机接口
 * @Date 2023/11/27 22:46
 */
public interface Phone {
    String call();
}
package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/27 22:47
 */
public class PhoneApple implements Phone {
    @Override
    public String call() {
        return "Call sb. by Apple phone...";
    }
}
package cn.jaa.abstract_factory_pattern;

/**
 * @Author:
 * @Description:
 * @Date 2023/11/27 22:48
 */
public class PhoneHuawei implements Phone {
    @Override
    public String call() {
        return "Call sb. by Huawei phone...";
    }
}

3、手机工厂类

package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/27 22:57
 */
public class PhoneFactory extends AbstractFactory{
    @Override
    public Phone createPhone(String phoneName) {
        if ("Apple".equals(phoneName)) {
            return new PhoneApple();
        } else if ("Huawei".equals(phoneName)) {
            return new PhoneHuawei();
        } else {
            return null;
        }
    }

    @Override
    public Computer createComputer(String brand) {
        return null;
    }
}

4、电脑接口及其实现类

package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description: 电脑接口
 * @Date 2023/11/27 22:52
 */
public interface Computer {
    String internet();
}
package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/27 22:54
 */
public class ComputerApple implements Computer{
    @Override
    public String internet() {
        return "Surf the Internet by Apple computer...";
    }
}
package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/27 22:55
 */
public class ComputerHuawei implements Computer{
    @Override
    public String internet() {
        return "Surf the Internet by Huawei computer...";
    }
}

5、电脑工厂

package cn.jaa.abstract_factory_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/27 22:59
 */
public class ComputerFactory extends AbstractFactory{
    @Override
    public Phone createPhone(String brand) {
        return null;
    }

    @Override
    public Computer createComputer(String computerName) {
        if ("Apple".equals(computerName)) {
            return new ComputerApple();
        } else if ("Huawei".equals(computerName)) {
            return new ComputerHuawei();
        } else {
            return null;
        }
    }
}

6、抽象工厂模式测试

package cn.jaa.abstract_factory_pattern;

import java.util.logging.Logger;

/**
 * @Author: Jaa
 * @Description: 抽象工厂模式测试
 * @Date 2023/11/27 23:01
 */
public class AbstractFactoryDemoTest {

    private static final Logger log = Logger.getLogger(String.valueOf(AbstractFactoryDemoTest.class));

    public static void main(String[] args) {
        AbstractFactory computerFactory = new ComputerFactory();
        Computer macbook = computerFactory.createComputer("Apple");
        Computer matebook = computerFactory.createComputer("Huawei");
        log.info(macbook.internet());
        log.info(matebook.internet());

        AbstractFactory phoneFactory = new PhoneFactory();
        Phone apple = phoneFactory.createPhone("Apple");
        Phone huawei = phoneFactory.createPhone("Huawei");
        log.info(apple.call());
        log.info(huawei.call());
    }
}

打印结果如下:

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

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

相关文章

SQL Server的安装和首个库的创建

一、熟悉SQL Server的安装环境; 1.安装Microsoft的数据库管理系统SQL Server 2022 先把SQL Server 2022下载好后进行解压后出现以下界面然后点击基本进行安装 然后会出现以下界面: 一步步按照提示往下走即可,把SQL Server 2022安装完成后再…

代码随想录算法训练营 ---第五十五天

今天是 动态规划:编辑距离问题。 第一题: 简介: 动态规划五部曲: 1.确定dp数组的含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 2.确定递推公…

性能测试流程、指标及常见问题!

1.介绍性能测试流程 a.性能需求分析(评审) 基于接口或者场景(全链路)的性能测试指标,一般是tps(每秒事务数,这里都是通过的事务)及art(平均响应时间) b.了解…

基于JSDoc实现TypeScript类型安全的实践报告

在FEDay 2023中我讲了《从JS到TS无缝迁移的实践报告》【视频在这里在这里】,是将一个传统的JS项目(mochajs/mocha)迁移到TypeScript环境的全程。其中提到了一件事情,就是“可以通过JSDoc/TSDoc来生成.d.ts”,从而实现T…

Shell数组函数:数组(二)

关联数组 注意:先声明关联数组 一、定义关联数组 方法一 #一次赋一值 #数组名[索引]变量值 [rootlocalhost ~]# declare -A ass_array1 [rootlocalhost ~]# ass_array1[index1]pear [rootlocalhost ~]# ass_array1[index2]apple [rootlocalhost ~]# ass_array1[ind…

centos7-zabbix安装与使用(较全的配置)

文章目录 zabbix介绍一、zabbix是什么1.1 zabbix专用词汇1.2 zabbix程序组件 二、zabbix的优缺点三、为什么使用zabbix3.1 zabbix可以满足的监控系统需求 四、zabbix监控的生命周期 zabbix安装一、zabbix环境搭建1.1 安装wget1.2 关闭防火墙1.3 关闭SELinux 二、安装zabbix2.1 …

234 回文链表

解题思路: \qquad 由于链表的结构特点,访问链表中的元素的时间复杂度为O(n)。相比较而言,使用数组会方便很多,实现O(1)访问。 \qquad 所以这个题,可以先遍历一遍把数值存到数组中,再使用双指针判断是否是…

12.5 作业

1, 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有…

Leetcode刷题笔记题解(C++):LCR 021. 删除链表的倒数第 N 个结点

思路:用双指针去遍历链表,删除left的下一个节点,注意的是n大于等于链表长度即删除第一个节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {…

CTF特训日记day(4-6)

来复现一下2022QWB决赛的RDP题目 这两天腰疼去了趟医院 题目要求我们攻击XRDP程序,从而达到本地提权的效果。 首先观察XRDP程序的版本信息 rootRDP:/home/rdp/Desktop# xrdp-sesman -version xrdp-sesman 0.9.18The xrdp session managerCopyright (C) 2004-2020…

supervisor管理python进程

前言 平时开发调试中使用conda环境,项目比较多环境多,而且命令繁杂,每一次启动项目都可能会因为忘记启动方式而频繁报错。现在可以通过supervisor来管理,只需要配置几个文件,就可以轻松通过简单一致的命令启动工程&…

《悲风》——川西的爱情史诗-历史风貌中的人性之旅

《悲风》——川西的爱情史诗-历史风貌中的人性之旅 《悲风》:一部穿越时空的情感史诗,展现了中国川西地区的历史风貌和深刻的人性探索。本作品以1936年秋为起点,讲述了一个关于爱情、忠诚、背叛与成长的故事。 故事主线围绕着两个青梅竹马的…

项目经理是干出来的,不是教出来的

大家好,我是老原。 有不少新手项目经理,在通过了PMP认证考试,拿到PMP证书后,对之前无序的项目管理状态感觉有了一丝通透的感觉,对接受新项目更是信心满满。 然后就有不少没有项目管理经验,且刚刚考取PMP证…

Photoshop最新版PS2024安装使用 Ver25.0.0

Photoshop,这个是长红了几十年的软件,我大概从它的3.0版本开始用,目前已迭代到25.0,但一直还在用CS4/11.0版本,一直秉持着够用即可的原则,因为不是专业的平面设计人员,能够简单PP图片就行。&…

关于队列的简单理解

1.队列(Queue) 1.1 关于队列 队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表, 队列具有先进先出 FIFO(First In First Out)的操作特性(队列是个接口); 入队列&#x…

P5 Linux 标准C库函数

目录 前言 01 标准输入、标准输出和标准错误 02 打开文件 fopen() 03 新建文件的权限 04 fclose()关闭文件 05 读文件和写文件 06 库函数 fseek 定位 6.1 lseek的使用 07 ftell()函数 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_Chen…

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计)

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计) 1、时间:2005-2021年 2、指标:省、市、年份、一级指标、关键词、关键词词频、总词频 3、范围:270个地级市 4、来源:地级市政府工作报告…

最全Web前端校招面试真题合集(附答案)

历时半年,我们整理了这份市面上最全面的前端校招面试题解析大全。 包含了腾讯、字节跳动、百度、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目。希望对大家参加前端校招有所帮助吧! HTML 浏览器页面有哪三层构成&…

Android MVVM+coroutine+retrofit+flow+hilt

文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构: 依赖注入层 数据库: Module InstallIn(SingletonComponent::class) class DBModule {Singleto…

力扣第374场周赛题解

这一场周赛的题目是比较难的一次,写了1个多小时就写了两个题目。 首先第一题: 纯水题,遍历然后进行一下判断就可以解决了。这边就不放代码了。 第二题: 这个题目,我觉得难度非常大,其实代码量也不大都是很…
最新文章