[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

前言:
为什么之前写过Golang 版的设计模式,还在重新写Java 版?
答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。
为什么类图要附上uml
因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那么学习者也只能复制一张图片,可复用性较低,附上uml,方便有新理解时,快速出新图。


🔥[设计模式Java实现附plantuml源码]专链

  1. 确保对象的唯一性~单例模式
  2. 集中式工厂的实现~简单工厂模式
  3. 多态工厂的实现——工厂方法模式
  4. 产品族的创建——抽象工厂模式
  5. 对象的克隆~原型模式
  6. 复杂对象的组装与创建——建造者模式

文章目录

      • 代码实现
      • 抽象工厂总结
        • 抽象工厂模式的主要优点如下:
        • 抽象工厂模式的主要缺点是:
      • 适用场景


工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题。但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是本章将要学习的抽象工厂模式的基本思想。

为了更好地理解抽象工厂模式,这里先引入如下两个概念:
(1)产品等级结构。产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2)产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
image.png

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
抽象工厂模式定义如下:抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。

在这里插入图片描述

@startumlabstract class 抽象产品族1海尔{}class 产品1电视机 extends 抽象产品族1海尔 {}
class 产品2洗衣机 extends 抽象产品族1海尔 {}abstract class 抽象产品族2{}abstract class 抽象工厂 {+ 生产抽象产品族1():抽象产品族1海尔
+ 生产抽象产品族2():抽象产品族2
}class 具体工厂1 extends 抽象产品族1海尔 implements 抽象工厂 {
+ 生产产品1():抽象产品族1海尔
+ 生产产品2():抽象产品族1海尔
}具体工厂1 -up-> 产品1电视机
具体工厂1 -up-> 产品2洗衣机@enduml

在抽象工厂模式结构图中包含以下4个角色。
(1)AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每个方法对应一种产品。
(2)ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每种产品都位于某个产品等级结构中。
(3)AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
(4)ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。

代码实现

public class AbstractFactoryDemo {// 抽象产品族1static abstract class AbstractProductFamily1 {}// 产品1static class Product1 extends AbstractProductFamily1 {}// 产品2static class Product2 extends AbstractProductFamily1 {}// 抽象产品族2static abstract class AbstractProductFamily2 {}// 抽象工厂interface AbstractFactory {AbstractProductFamily1 createProductFamily1();AbstractProductFamily2 createProductFamily2();}// 具体工厂1static class ConcreteFactory1 implements AbstractFactory {@Overridepublic AbstractProductFamily1 createProductFamily1() {return new Product1();}@Overridepublic AbstractProductFamily2 createProductFamily2() {// 在具体工厂1中创建抽象产品族2的实例return null; // 根据具体情况进行实现}}public static void main(String[] args) {// 创建具体工厂1的实例AbstractFactory factory = new ConcreteFactory1();// 使用具体工厂1创建抽象产品族1的实例AbstractProductFamily1 product1 = factory.createProductFamily1();AbstractProductFamily1 product2 = factory.createProductFamily1();System.out.println(product1);System.out.println(product2);// 使用具体工厂1创建抽象产品族2的实例AbstractProductFamily2 product3 = factory.createProductFamily2();System.out.println(product3);}}

抽象工厂总结

抽象工厂模式的主要优点如下:

(1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了在抽象工厂中声明的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
(3)增加新的产品族很方便,无须修改已有系统,符合开闭原则。

抽象工厂模式的主要缺点是:

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。

适用场景

在以下情况下可以考虑使用抽象工厂模式:
(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
(2)系统中有多于一个的产品族,而每次只使用其中某一个产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。例如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类 型。
(4)产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

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

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

相关文章

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中,从 7 → 3 → 8 →…

yolov8上使用gpu教程

yolov8上使用gpu教程 安装Cuda和Cudnnyolov8上使用gpu 安装Cuda和Cudnn 1.查看支持的cuda版本,并去官网下载。 nvidia-smi2.网址:https://developer.nvidia.com/cuda-toolkit-archive 3.安装细节 安装的前提基础是,有vs的C环境。我电脑有…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期(Life Cycle)是指一个组件从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由 vue 框架提供的内置函数,会伴随着 组件…

必知的量化交易基础

量化交易核心概念 量化思想 量化交易 量化交易是指以先进的数学模型代替人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的…

对Git更深入了解与学习

对Git更深入了解与学习 0. 前言0.1 工作区与暂存区 1. git remote update origin2. git push origin --delete 分支名 删除远端分支3. git remote4. git fetch5. git status5.1 git status 直观理解5.2 暂存与暂存取消 (git restore)5.3 push之后 6. git…

SpringBootAdmin邮件通知

在上一篇中我们学习到了 Admin Service Clustering 分布式缓存配置 ,这一篇我们来学习,客户端离线,出现故障的时候,我们这么能及时知道呢,发现邮件通知也许是最简单的方式了! 邮件通知 邮件通知将作为使用…

Linux文本编辑器-vi/vim

一.vi/vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本,兼容 vi 的所有指令,不仅能编辑文本,而…

哈希的基本概念(开散列和闭散列)(附代码)

哈希 哈希概念哈希冲突哈希函数常见的哈希函数 哈希冲突的解决闭散列开散列 哈希概念 传统的查找函数,搜索的效率取决于比较的次数。而hash算法:在理想情况下,可以不经过任何比较,一次就能得到要搜索的结果。 存储结构&#xff1…

面向社交网络语言隐写分析

论文:Linguistic Steganalysis Toward Social Network 发表在:IEEE Transactions on Information Forensics & Security是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊&#xff0c…

​用技术的视角,去看一台家用 MPV 该有的水准

「MPV」一个在 2023 年之前都属于「小众」车型的品类。 但从 2023 年初开始,MPV 却变成了新能源,特别是高端新能源品牌必争的细分产品。 从岚图推梦想家开始,到腾势 D9,再到极氪 009,最后到魏牌高山,标志…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

Java中的this和super

①this 在Java中,this关键字代表当前对象的引用。它可以用于以下几个方面: 引用当前对象的成员变量:使用this关键字可以引用当前对象的成员变量,以区分成员变量和方法参数或局部变量之间的命名冲突。例如,如果一个方法…

LeetCode做题总结 226. 翻转二叉树

226. 翻转二叉树 代码1 报错代码2 报错代码3 正确。 代码1 报错 class Solution {public TreeNode invertTree(TreeNode root) {// TreeNode _root root; // 这是在保证// _root preOrderTree(root);// return root;root preOrderTree(root);return root;}public TreeNode …

【机器学习300问】15、什么是逻辑回归模型?

一、逻辑回归模型是为了解决什么问题? 逻辑回归(Logistic Regression)是一种广义线性回归分析模型,尤其适用于解决二分类问题(输出为两个类别)。 (1)二分类举例 邮件过滤&#xff…

Java Web(五)--DOM

介绍 DOM 全称是 Document Object Model 文档对象模型; DOM 是 W3C(万维网联盟)的标准。 DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) 是中立于平台和语言的接口&#xff0…

pdf怎么转换成jpg图片?pdf转图片工具用它就够了

有时候,我们可能需要将pdf文档转换为图片格式,以便于文档的处理和管理。通过将pdf转换为图片,可以将每一页pdf转换为独立的图片文件,便于整理、存储和管理,如果您有多个PDF文件需要转换成图片,可以批量pdf转…

Modern C++ std::bind的实现原理

1. 前言 前面写过《std::function从实践到原理》,管中规豹了std::function的一点点原理,不过还有一个与std::function密切相关的函数std::bind, 允许编程者绑定几个参数,本文着重介绍它的实现原理。不介绍一下它,有点吃肉不吃蒜味…

npm安装卡住问题(最新版)

npm安装卡住问题(最新版) 背景: ​ 最近这两天用npm安装一些包的时候,发现一直卡住: 报错: idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了,我一想,是不是源头的问题,还真是…

C语言每日一题(48)回文链表

力扣 234 回文链表 题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#xff1…

Redis性能运行参数的监测工具 - WGCLOUD

WGCLOUD是一款开源免费的运维监控平台,可以监测Redis的运行情况,比如redis的Key数量,过期Key数量,Redis的端口号,Redis的版本,同步状态,集群模式,使用内存等等数据 中间件Redis监测…