六、抽象工厂模式

news2024/12/22 18:28:01

一、什么是抽象工厂模式

  抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

  抽象工厂模式的主要角色如下。

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

二、抽象工厂模式的实现

  假设有1、2两种产品,而每种产品都有1、2两种不同的类型,那么就会组合出1_1、1_2、2_1、2_2四种不同的产品。每个工厂都可以生产 产品1 和产品2,那么久需要四个工厂去生产不同的 产品1和2 的组合,代码如下:
1、抽象产品

  • 抽象产品1
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:05
 * @description 抽象产品1
 */
public interface AbstractProduct1 {
    void show();
}
  • 抽象产品2
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:05
 * @description 抽象产品2
 */
public interface AbstractProduct2 {
    void show();
}

2、具体产品(每个产品有两个不同型号)

  • 产品1的型号1
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:07
 * @description 抽象产品1 的实现1
 */
public class ConcreteAbstractProduct1_1 implements AbstractProduct1 {
    @Override
    public void show() {
        System.out.println("产品1的1类型生成完毕...............");
    }
}
  • 产品1的型号2
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:07
 * @description 抽象产品1 的实现2
 */
public class ConcreteAbstractProduct1_2 implements AbstractProduct1 {
    @Override
    public void show() {
        System.out.println("产品1的2类型生成完毕...............");
    }
}
  • 产品2的型号1
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:07
 * @description 抽象产品2 的实现1
 */
public class ConcreteAbstractProduct2_1 implements AbstractProduct2 {
    @Override
    public void show() {
        System.out.println("产品2的1类型生成完毕...............");
    }
}
  • 产品2的型号2
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:07
 * @description 抽象产品2 的实现2
 */
public class ConcreteAbstractProduct2_2 implements AbstractProduct2 {
    @Override
    public void show() {
        System.out.println("产品2的2类型生成完毕...............");
    }
}

3、抽象工厂

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:04
 * @description 抽象工厂
 *
 * 抽象工厂可以生成 抽象产品1 和 抽象产品2
 *
 */
public interface AbstractFactory {
    AbstractProduct1 createProduct1();
    AbstractProduct2 createProduct2();
}

4、具体工厂

  • 具体工厂1,生产1_1、2_1 两种产品的套装
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:10
 * @description 抽象工厂类 的实现1
 *
 * 不同的實現 可以組裝不同的產品 这个工厂组装  产品1 的实现1   和产品2 的实现1
 */
public class ConereteFacotry1 implements AbstractFactory {
    @Override
    public AbstractProduct1 createProduct1() {
        System.out.println("开始生成产品1的类型1..........");
        return new ConcreteAbstractProduct1_1();
    }

    @Override
    public AbstractProduct2 createProduct2() {
        System.out.println("开始生成产品2的类型1..........");
        return new ConcreteAbstractProduct2_1();
    }
}
  • 具体工厂2,生产1_2、2_1 两种产品的套装

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:10
 * @description 抽象工厂类 的实现2
 *
 * 不同的實現 可以組裝不同的產品 这个工厂组装  产品1 的实现2   和产品2 的实现1
 */
public class ConereteFacotry2 implements AbstractFactory {

    @Override
    public AbstractProduct1 createProduct1() {
        System.out.println("开始生成产品1的类型2..........");
        return new ConcreteAbstractProduct1_2();
    }

    @Override
    public AbstractProduct2 createProduct2() {
        System.out.println("开始生成产品2的类型1..........");
        return new ConcreteAbstractProduct2_1();
    }
}
  • 具体工厂3,生产1_1、2_2 两种产品的套装
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:10
 * @description 抽象工厂类 的实现3
 *
 * 不同的實現 可以組裝不同的產品 这个工厂组装  产品1 的实现1   和产品2 的实现2
 */
public class ConereteFacotry3 implements AbstractFactory {
    @Override
    public AbstractProduct1 createProduct1() {
        System.out.println("开始生成产品1的类型1..........");
        return new ConcreteAbstractProduct1_1();
    }

    @Override
    public AbstractProduct2 createProduct2() {
        System.out.println("开始生成产品2的类型2..........");
        return new ConcreteAbstractProduct2_2();
    }
}
  • 具体工厂4,生产1_2、2_2 两种产品的套装
/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 16:10
 * @description 抽象工厂类 的实现1
 *
 * 不同的實現 可以組裝不同的產品 这个工厂组装  产品1 的实现2   和产品2 的实现2
 */
public class ConereteFacotry4 implements AbstractFactory {
    @Override
    public AbstractProduct1 createProduct1() {
        System.out.println("开始生成产品1的类型2..........");
        return new ConcreteAbstractProduct1_2();
    }

    @Override
    public AbstractProduct2 createProduct2() {
        System.out.println("开始生成产品2的类型2..........");
        return new ConcreteAbstractProduct2_2();
    }
}

5、测试类


/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/2 0002 15:41
 * @description 抽象工厂模式
 *  抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
 *
 * 抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
 *
 * 使用抽象工厂模式一般要满足以下条件。系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
 * 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
 *
 * 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
 * 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
 *
 * 其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
 * 模式的结构与实现:
 *      抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。
 * 模式的结构:
 *  抽象工厂模式的主要角色如下。
 *      抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
 *      具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
 *      抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
 *      具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
 *
 */
public class Main {
    /**
     * 测试工厂1  创建产品1 的类型1   和产品2 的类型1 的组合
     */
    @Test
    public void abstractFactoryTest1(){
        AbstractFactory abstractFactory = new ConereteFacotry1();
        AbstractProduct1 abstractProduct1 = abstractFactory.createProduct1();
        AbstractProduct2 abstractProduct2 = abstractFactory.createProduct2();
        abstractProduct1.show();
        abstractProduct2.show();
    }
    /**
     * 测试工厂1  创建产品1 的类型2   和产品2 的类型1 的组合
     */
    @Test
    public void abstractFactoryTest2(){
        AbstractFactory abstractFactory = new ConereteFacotry2();
        AbstractProduct1 abstractProduct1 = abstractFactory.createProduct1();
        AbstractProduct2 abstractProduct2 = abstractFactory.createProduct2();
        abstractProduct1.show();
        abstractProduct2.show();
    }
    /**
     * 测试工厂1  创建产品1 的类型1   和产品2 的类型2 的组合
     */
    @Test
    public void abstractFactoryTest3(){
        AbstractFactory abstractFactory = new ConereteFacotry3();
        AbstractProduct1 abstractProduct1 = abstractFactory.createProduct1();
        AbstractProduct2 abstractProduct2 = abstractFactory.createProduct2();
        abstractProduct1.show();
        abstractProduct2.show();
    }
    /**
     * 测试工厂1  创建产品1 的类型2   和产品2 的类型2 的组合
     */
    @Test
    public void abstractFactoryTest4(){
        AbstractFactory abstractFactory = new ConereteFacotry4();
        AbstractProduct1 abstractProduct1 = abstractFactory.createProduct1();
        AbstractProduct2 abstractProduct2 = abstractFactory.createProduct2();
        abstractProduct1.show();
        abstractProduct2.show();
    }
}

运行结果依次如下:


开始生成产品1的类型1..........
开始生成产品2的类型1..........
产品11类型生成完毕...............
产品21类型生成完毕...............



Process finished with exit code 0

开始生成产品1的类型2..........
开始生成产品2的类型1..........
产品12类型生成完毕...............
产品21类型生成完毕...............



Process finished with exit code 0

开始生成产品1的类型1..........
开始生成产品2的类型2..........
产品11类型生成完毕...............
产品22类型生成完毕...............



Process finished with exit code 0

开始生成产品1的类型2..........
开始生成产品2的类型2..........
产品12类型生成完毕...............
产品22类型生成完毕...............



Process finished with exit code 0

三、应用场景

  抽象工厂模式通常适用于以下场景:

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

四、优缺点分析

  抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
  • 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

其缺点是:

  • 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

代码地址:https://gitee.com/fluffycatkin/JavaDesignModel.git

image.png

原文出处:http://c.biancheng.net/view/1351.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享办公室的7S管理

共享办公室的7S管理是一个全面且详细的过程,它涵盖了整理(Sort)、整顿(Straighten)、清扫(Sweep)、清洁(Sanitize)、素养(Sustain)、安全&#xf…

报错:Cannot read properties of undefined (reading ‘$message‘)

报错 一、问题二、分析三、解决 一、问题 Cannot read properties of undefined (reading ‘$message’) 二、分析 是因为在 main.js 文件中,此时还未有 this,我们可以打印一下,是 null 三、解决 如果想要使用 this.$message(这是一条消息…

数仓数据建模中的概念总结(数据域、主题域、总线矩阵、指标...)

概念归纳 业务分类:业务板块是某一大类业务的指标和维度的集合,如电商,文 娱。 数据域:面向业务分析,将业务过程或者维度进行抽象的集合,如交易域, 日志域。 将零散的需求分类,后续…

VSCode配置C语言环境(简单易懂,小白专用)

1.在VSCode中安装C/C插件和C/C Extension Pack插件 2.下载mingw64 mingw64官网网页链接 1、找到downloads ​​​​​​​​ 2、找到SourceForge 3、找到一个合适的版本(我这里是下拉找到免安装版)下载,其他的都试过了,都不行&a…

window11,C盘瘦身减肥技巧

创作灵感 本文主要说明如何给windows11的C盘进行空间优化,或者叫减肥瘦身,让其达到20G以内。绝大部分内容,也适用于window10和windows7,只是操作系统不同,操作方式略有不同。不关注C盘空间的读者,可以忽略…

rsync命令介绍与使用案例

一、rsync命令简介 Rsync命令是一个常用的用于文件传输和同步的工具,rsync 可以理解为 remote sync(远程同步),为了减少网络数据发送量,只发送源文件和目标文件之间的差异信息,从而实现数据的增量的复制。它…

DP3232 国产RS-232接口收发器芯片

DP3232是一个3.3 V.供电的 EIA/TIA-232和 V.28/V.24通信接口,具有低功耗要求、高数据速率能力。DP3232拥有一个专有的低压差发射机输出平台,提供真正的 RS-232性能,从3.3 vV 到5.5 V 电源。该设备只需要四个小的0.1 μF 标准外部电容器从3.3 …

原生小程序 wxs 语法(详细)

WXS WXS(WeiXin Script)是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本,丰富模板的数据预处理能力。另外, WXS 还可以用来编写简单的 WXS 事件响应函数。 从语法上看, WXS 类似于有少量限制的 Java…

LOIC(low orbit ion cannon)

前言 重要的话说三遍: 该程序仅用于学习用途,请勿用于非法行为上!!! 该程序仅用于学习用途,请勿用于非法行为上!!! 该程序仅用于学习用途,请勿用于非法行为上…

麒麟系统查看飞腾CPU的工作模式、实时频率的方法

CPU动态节能技术用于降低功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低CPU功耗,更低的功耗策略意味着CPU唤醒更慢对性能影响更大。本文这里讲解了如何使用命令查看系统下CPU的工作模式,和实时频率。 测试用系统信息: # cat /etc/os-releaseNAME=&qu…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库,其中包括新的集合类型(例如 multimap 和…

《自然》杂志最新研究成果,新冠卷土重来,仍然凶险,别不当回事儿

我同事又带口罩了,他说已阳。我很奇怪怎么不认为是感冒呢? 他低声地说,家里还有去年囤的试剂盒,我测了一个。 我还好,只在年初时候阳过一次。 应该说,我们比较庆幸,新冠毒株已经温和&#xff0c…

linux服务磁盘满了操作

1、使用xshell连接上服务器 2、# df -h 查看系统磁盘使用情况 3、查看使用比较多的文件,cd 跳转到该文件夹下,ls 查看文件 # du -h查看该文件夹下各个文件大小 4、查找logs文件 ,删除logs 文件内容 使用 删除名为directory下的所有文件…

杭州华宫养老服务有限公司官网上线 | LTD养老服务行业案例分享

数字化时代,养老服务行业也逐渐的意识到借助互联网进行营销的重要性,但是,随着互联网渠道成本的不断攀升,如何获取稳定流量成为养老服务机构目前所面临的重要挑战。 于是,杭州华宫养老服务有限公司作为养老服务行业崛…

深圳产品展示视频拍摄一站式服务

产品展示视频拍摄一站式服务是指一家专业的拍摄制作公司或团队提供从策划、拍摄到后期制作的全方位服务,以满足客户的产品展示需求。这种服务通常包括以下方面,由产品展示视频制作公司老友记小编从以下几个方面为您整理: 1.策划和预制阶段&a…

黑客组织“Anonymous”进行网络攻击抗议日本排放核污水

概述 近期全球都在关注日本核污水排放,起因是日本政府宣布,福岛第一核电站核污染水8月24日开始排入海洋,计划排放30年。那么这件事为什么会引起全球关注呢,大家通过美国对日本投放原子弹后果,导致广岛长崎任然处于核辐…

Java SPI 机制

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech 什么是 SPI 机制 SPI (Service Provider Interface)是 Java 内置的一种服务提供发现机制,将功能的实现交给第三方,用来拓展和替换组件。 SPI 的…

ESB(Enterprise Service Bus,即企业服务总线)

以前用过部分功能,但是没有很好地去理解过。 ESB(Enterprise Service Bus,即企业服务总线)是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。 企业服…

【Bug】Ubuntu 有线设置打不开无反应

前言: 突然有线设置就没法启用了,但是能联网,能查看ip 解决: 最后安装了一个新的依赖包: sudo apt install gnome-control-center 然后就可以了 还有一个方法,没试过,但感觉有点道理的&#…

《向量数据库》——为何向量数据库对大模型LLM很重要?

当您浏览Twitter、LinkedIn或新闻源上的时间轴时,可能会看到一些关于聊天机器人、LLM和GPT的内容。因为每周都有新的LLM发布,很多人都在谈论LLM。 我们目前置身于一场人工智能革命,许多新应用都依赖于向量嵌入。不妨让我们更多地了解向量数据库以及为什么它们对LLM很重要。…