当前位置: 首页 > news >正文

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

创建型-抽象工厂

角色

  1. 抽象工厂: 声明创建一个族产品对象的方法,每个方法对应一中产品,抽象工厂可以是接口,也可以是抽象类;
  2. 具体工厂: 实现抽象工厂接口,复杂创建具体的一族产品;
  3. 抽象产品:定义一类产品的公共接口,描述一类产品的特定行为或者属性;
  4. 具体产品:实现抽象产品接口,定义具体产品的特定行为和属性;

其中,一族的概念可根据业务情况进行分族。比如:形状,颜色可分为两个族,再比如,植物, 动物也可以分为两个族。族的概念根据区分维度不同可分为不同的族;

图解

在这里插入图片描述

实现案例

这个案例中按照年龄将人分为小孩,老年人,中年人三族,产品分为上衣、裤子、鞋子三个种类;其中实现了老年人和小孩两个族衣服的抽象工厂。

抽象产品类:

/** 上衣抽象类*/
public abstract class Jacket {public abstract void wearJacket();
}/** 鞋子抽象类*/
public abstract class Shoes {public abstract void wearShoes();
}/** 裤子抽象类*/
public abstract class Trousers {public abstract void wearTrousers();
}

具体产品类:

/** 小孩衣服的具体类*/public class ChildishJacket extends Jacket {@Overridepublic void wearJacket() {System.out.println("小孩的上衣");}
}
public class ChildishShoes extends Shoes {@Overridepublic void wearShoes() {System.out.println("小孩的鞋子");}
}
public class ChildishTrousers extends Trousers {@Overridepublic void wearTrousers() {System.out.println("小孩的裤子");}
}/** 老年人衣服的具体类*/
public class OldJacket extends Jacket {@Overridepublic void wearJacket() {System.out.println("老年人上衣");}
}
public class OldTrousers extends Trousers {@Overridepublic void wearTrousers() {System.out.println("老年人的裤子");}
}
public class OldShoes extends Shoes {@Overridepublic void wearShoes() {System.out.println("老年人的鞋子");}
}

抽象工厂类:

/** 生产衣服的抽象工厂*/
public abstract class AbstractClothesFactory {public abstract Jacket createJacket();public abstract Shoes createShoes();public abstract Trousers createTrousers();
}

具体工厂类:

/** 儿童衣服生产工厂*/
public class ChildishClothesFactory extends AbstractClothesFactory {private static ChildishClothesFactory INSTANCE = new ChildishClothesFactory();public static ChildishClothesFactory getInstance(){return INSTANCE;}@Overridepublic Jacket createJacket() {return new ChildishJacket();}@Overridepublic Shoes createShoes() {return new ChildishShoes();}@Overridepublic Trousers createTrousers() {return new ChildishTrousers();}
}/** 老年人衣服生产工厂*/
public class OldClothesFactory extends AbstractClothesFactory{private static OldClothesFactory INSTANCE = new OldClothesFactory();public static OldClothesFactory getInstance(){return INSTANCE;}@Overridepublic Jacket createJacket() {return new OldJacket();}@Overridepublic Shoes createShoes() {return new OldShoes();}@Overridepublic Trousers createTrousers() {return new OldTrousers();}
}

使用:

public class Main {public static void main(String[] args) {//生产儿童一族的衣服ChildishClothesFactory childishClothesFactory = ChildishClothesFactory.getInstance();Jacket childishJacket = childishClothesFactory.createJacket();Shoes childishShoes = childishClothesFactory.createShoes();Trousers childishTrousers = childishClothesFactory.createTrousers();//生产老年人一族的衣服OldClothesFactory oldClothesFactory = OldClothesFactory.getInstance();Jacket oldJacket = oldClothesFactory.createJacket();Shoes oldShoes = oldClothesFactory.createShoes();Trousers oldTrousers = oldClothesFactory.createTrousers();childishJacket.wearJacket();oldJacket.wearJacket();}
}

总结

  1. 抽象工厂是生产一族的产品,族的概念可根据不同的业务规则区分。
  2. 扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
  3. 对于新增族来说,满足开闭原则,而对于新增产品来说,不满足开闭原则。

相关文章:

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

创建型-抽象工厂 角色 抽象工厂: 声明创建一个族产品对象的方法,每个方法对应一中产品,抽象工厂可以是接口,也可以是抽象类;具体工厂: 实现抽象工厂接口,复杂创建具体的一族产品;抽…...

攻防世界---web---Web_php_unserialize

1、题目描述 2、 3、分析代码 class Demo { private $file fl4g.php; }:定义了一个名为Demo的类,该类有一个私有属性$file,默认值为fl4g.php。 $a serialize(new Demo);:创建了一个Demo类的实例,并对其进行序列化&a…...

嵌入式学习记录

一 环境搭建 1.Ubuntu ssh登陆开发板,短命令替换ssh命令 交叉编译命令 sudo gedit ~/.bashrc # 文件结尾加入: alias tob"ssh root192.168.1.104" alias gb"arm-buildroot-linux-gnueabihf-gcc"往后终端输入top 相当于输入ssh roo…...

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…...

idea mac快捷键

Mac快捷键 快捷键 说明 ⌘ F 在当前窗口查找 ⌘ ⇧ F 在全工程查找 ⌘ ⇧ ⌥ N 查找类中的方法或变量 F3 / ⇧ F3 移动到搜索结果的下/上一匹配处 ⌘ R 在当前窗口替换 ⌘ ⇧ R 在全工程替换 ⌘ ⇧ V 可以将最近使用的剪贴板内容选择插入到文本 ⌥…...

Day1——一些感想,学习计划和自我激励(不重要,跳过吧)

笨人刚刚接触计算机的时候,属于是两眼一抹黑。高考后玩了一整个暑假,脑子已经丢掉了,学起来很痛苦,但是也在学习过程中接触到了很多新鲜的东西,现在对于计算机的各种方向,我都很想试试(试试就逝…...

网络安全渗透工具汇总

一、HackBar github地址:https://github.com/Mr-xn/hackbar2.1.3.git 介绍 HackBar是一款基于浏览器的渗透测试工具,可以简化目标网站的攻击流程。它可以轻松地注入JavaScript和其他脚本,进行SQL注入、XSS攻击、各种类型的扫描等。该工具…...

JavaScript 学习笔记 总结

回顾: Web页面标准 页面结构:HTML4、HTML5页面外观和布局:CSS页面行为:JavaScript强调三者的分离前后端分离开发模式 响应式设计Bootstrap框架入门 Bootstrap总结 基础 下载和使用基础样式:文本样式、图片样式、表格…...

分布式架构与分布式理论

文章目录 分布式架构什么是分布式系统分布式系统特性分布式系统面临的问题 分布式理论数据一致性CAP理论BASE理论 分布式架构 什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 所谓分…...

Qt——前言

一、Qt介绍 ​ **Qt技术特指用来桌面应用开发;**客户端开发的重要任务就是编写和用户交互的界面;而与用户交互的界面有两种典型风格,1.命令行界面/终端界面,TUI;2.图形化界面,GUI; ​ Qt就是用…...

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错: 解决 这个大概率是缓存问题,我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示,说我包版本不对(但是这个是警告应该没事,但是我还是装了) npx expo install --…...

今日科普:了解、预防、控制高血压

高血压,常被称为“隐形的健康威胁”,许多患者可能在毫无预警的情况下发病,且患病率逐年攀升,同时患者群体逐渐年轻化,高血压虽然难以根治,但并不可怕,真正可怕的是血压长期居高不下,…...

Spark关于 ExpressionEncoder[T] 以及 RowEncoder 以及Spark怎么做外部数据和内部数据的转换

背景 本文基于 Spark 3.3, 最近在用 Spark Api 做 DataSet[Row] 转换的时候遇到了一些 Spark内部转换的问题, 在此记录一下。 杂谈 我们知道在Spark中分为 InternalRow和Row, 前者是 Spark 内部的使用的一行数据的表示,后者是给Spark开发者使用的行数…...

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午,DolphinDB 携手光大证券,在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场,深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…...

业财一体化的重点、难点和模式

业财一体化的内涵是企业将经营活动、财务管理、经营决策等进行科学的融合和管理,进而提高企业经营管理和财务决策的科学性,同时,基于IT技术、流程再造和组织重构更好的保障企业价值创造功能的实现。其涵盖管理循环、业务循环、信息循环三个双…...

gorse修改开源项目后,如何使用Docker compose发布

代码修改 git checkout v0.4.15 修改代码后提交。 镜像构建 export GOOSlinux export GOARCHamd64 export GOMAXPROCS8go build -ldflags"-s -w -X github.com/zhenghaoz/gorse/cmd/version.Version$(git describe --tags $(git rev-parse HEAD)) -X github.com/zhengh…...

Bowyer-Watson算法

数学原理及算法过程 Delaunay 三角剖分是一种特殊的三角剖分方法,它满足以下两个重要性质: 最大化最小角性质:Delaunay 三角剖分通过避免细长的三角形来最大化所有三角形的最小角。空外接圆性质:在 Delaunay 三角剖分中&#xf…...

计算机基础之:fork进程与COW机制

在Unix-like操作系统中,fork()是一个系统调用,用于创建一个与调用进程(父进程)几乎完全相同的新进程(子进程),包括父进程的内存空间、环境变量、文件描述符等。这个过程是通过写时复制&#xff…...

47.各种类型的线程池

线程池继承体系 Executor(interface)->ExecutorService(interface)->ThreadPoolExecutor(class) Executors.newFixedThreadPool 核心线程数最大线程数(没有救急线程被创建),所以也无需超时时间阻塞队列LinkedBlockingQueue,可以放任意…...

多目标优化-NSGA-II

文章目录 一、前置知识NSGA-II帕累托前沿 二、算法流程1.NSGA2.NSGA-II 一、前置知识 1.NSGA(非支配排序遗传算法):旨在同时优化多个冲突的目标函数,寻找帕累托前沿上的解集。 什么是多个冲突的目标: 比如你看上了一辆车,你既想要它便宜,又…...

靠专业建议收咨询费!传统旅游顾问转型AI行程规划师,如何在高定市场赚大钱

“上个月,我的咨询费增了好多。”说出这个数字时,前旅行社门店顾问小雅脸上带着自信的笑容。曾经的“人肉攻略机器”到如今的AI高端定制规划师,小雅的转型故事,或许能给所有被困在低价内卷里的旅游从业者带来全新的思路。一、转型…...

SQL分组Group By

一、先搞懂:分组查询是干嘛的?分组查询 GROUP BY 就是把表中数据按照某个字段「分类」,然后对每一类做统计。比如你 emp 表有 gender(性别)字段,用分组就能:统计「男员工有多少人、女员工有多少…...

你的ESP32项目还缺个BGM?手把手教你做个可切换歌单的迷你音乐播放器

为ESP32项目打造智能音乐模块:从蜂鸣器驱动到歌单管理系统 当你的智能家居设备在清晨用一段舒缓旋律唤醒你,或是机器人完成指令时播放一段俏皮的提示音,这种交互体验会瞬间提升产品的温度。ESP32作为一款功能强大的物联网芯片,完全…...

新手入门无人机飞控,别再傻傻分不清PIXHAWK、PX4和APM了

无人机飞控入门指南:PIXHAWK硬件与PX4/APM固件全解析 刚接触无人机DIY的新手,面对琳琅满目的飞控硬件和固件选择时,往往会陷入"PIXHAWK、PX4、APM到底有什么区别"的困惑。这就像第一次组装电脑时分不清CPU和操作系统的关系——硬件…...

OpenClaw压力测试:千问3.5-9B连续执行100个任务的稳定性

OpenClaw压力测试:千问3.5-9B连续执行100个任务的稳定性 1. 为什么需要压力测试? 上周我在本地部署了OpenClaw对接千问3.5-9B模型,准备用它来处理日常的文档整理和会议纪要工作。刚开始几个简单任务执行得很顺利,直到某天晚上让…...

告别打印乱码与错位:手把手教你配置SAP Smartforms的CNSAPWIN打印机格式

告别打印乱码与错位:手把手教你配置SAP Smartforms的CNSAPWIN打印机格式 在SAP系统的日常使用中,打印问题是最令人头疼却又无法回避的挑战之一。想象一下,当你精心设计的发票Smartforms报表终于完成,却在打印时发现内容被截断、错…...

为什么80%AI率降完后还有残留?根本原因在这

你用了降AI工具,处理前90%,处理后17%。 17%达标了,但还是有AI率残留。或者更糟,处理后22%,还是没过。 为什么工具处理后AI率不能降到0%?残留从哪来?怎么进一步处理? 残留AI率的三…...

云效流水线+K8s实战:Java微服务全自动部署与优化指南(手把手版)

1. 云效流水线入门:从零搭建Java微服务CI/CD管道 第一次接触云效流水线时,我像发现新大陆一样兴奋——原来部署可以这么简单!记得去年团队还在用Jenkins手动打包部署,每次发版都要折腾到凌晨。现在用云效 K8s的组合,我…...

JAVA重点基础、进阶知识及易错点总结(35)注解与反射

🚀 Java 巩固进阶 第 35 天 主题:注解与反射结合 —— 让注解"活"起来📅 进度概览:继昨天学习注解定义之后,今天进入 注解的核心应用场景:注解 反射。单独的注解只是"标签"&#xff…...

PX4开发实战:uORB通信机制详解与代码实操(附避坑指南)

PX4开发实战:uORB通信机制详解与代码实操(附避坑指南) 在PX4飞控开发中,uORB(Micro Object Request Broker)作为核心通信机制,承担着模块间数据交换的重要职责。不同于传统嵌入式系统中的全局变…...