基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

文章目录

  • 介绍
  • 开始
    • 架构图(以穿搭举例)
    • 样例一(html关于列表和表格的应用)
      • 定义抽象工厂(html)
      • 定义抽象工厂需要制作抽象产物(托盘)
      • 定义具体工厂(列表、表格)
      • 定义工厂生产零件(托盘)
    • 样例二(衣服关于春季和夏季的穿搭)
      • 定义抽象工厂(穿搭)
      • 定义抽象工厂需要制作抽象产物(上衣、下装)
      • 定义具体工厂(春季、夏季)
      • 定义工厂生产零件(上衣、下装)
    • 样例三(工厂关于小米和华为的生产)
      • 定义抽象工厂(制造工厂)
      • 定义抽象工厂需要制作抽象产物(手机、路由器)
      • 定义具体工厂(小米工厂、华为工厂)
      • 定义工厂生产零件(手机、路由器)
    • 测试样例
  • 总结

介绍

  在抽象工厂模式中,不仅有抽象工厂,还有抽象零件抽象产品。其中抽象工厂主要的工作职责将抽象零件组装成抽象产品
  第一大段,这么多抽象,抽象的含义到底是啥?它指:不考虑具体怎样实现,而是仅关注接口(API)的状态
  综上所诉:在 Abstract Factory 模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品。也就是说,
  我们并不关心零件的具体实现,而是只关心接口(API)。我们仅使用该接口(API)将零件组装成为产品

开始

架构图(以穿搭举例)

  抽象工厂作为主接口,不具备任何含义,只记录有上衣和下装。在季节工厂里面(也可以叫做季节产品),他们生产了一系列相应季节的上衣和下装。但对上衣和下装同时是比较抽象的,需要对上衣和下装(也可以叫做零件)赋予真正的含义,如:在上衣中有短袖、衬衫;在下装中,有牛仔裤和短裤。
  通过具体的零件,才有了品牌打出了季节产品,最后统称抽象为上衣、下装。
抽象工厂下面的工厂作为抽象产品
抽象产品制作抽象零件

样例一(html关于列表和表格的应用)

定义抽象工厂(html)

public interface HtmlFactory {/*** 创建一个抽象托盘** @return*/TrayService createTray();}

定义抽象工厂需要制作抽象产物(托盘)

  为什么要单独定义一个item接口,是因为对于html代码,我们的产物有<a>标签<b>标签等,最后都是需要一个html的模板所以,定义了一个item接口,让后续的抽象产物继承。

public interface Item {/*** 生成 html 代码*/String makeHTML();}
public interface TrayService extends Item {}

定义具体工厂(列表、表格)

@Service
@Slf4j
public class ListHtmlFactory implements HtmlFactory {@Resource(name = "listTrayServiceImpl")private TrayService trayService;@Overridepublic TrayService createTray() {return trayService;}}
@Service
@Slf4j
public class TableHtmlFactory implements HtmlFactory {@Resource(name = "tableTrayServiceImpl")private TrayService trayService;@Overridepublic TrayService createTray() {return trayService;}}

定义工厂生产零件(托盘)

@Service
@Slf4j
public class ListTrayServiceImpl implements TrayService {@Overridepublic String makeHTML() {return "<ul>\n" +"  <li>咖啡</li>\n" +"  <li>茶</li>\n" +"  <li>牛奶</li>\n" +"</ul>";}}
@Service
@Slf4j
public class TableTrayServiceImpl implements TrayService {@Overridepublic String makeHTML() {return "<table>\n" +"  <tr>\n" +"    <th>月份</th>\n" +"    <th>储蓄</th>\n" +"  </tr>\n" +"  <tr>\n" +"    <td>一月</td>\n" +"    <td>¥3400</td>\n" +"  </tr>\n" +"  <tr>\n" +"    <td>二月</td>\n" +"    <td>¥4500</td>\n" +"  </tr>\n" +"</table>";}
}

样例二(衣服关于春季和夏季的穿搭)

定义抽象工厂(穿搭)

public interface WearFactory {/*** 创建一个 衣服** @return*/ClothesService createClothe();/*** 创建一个 裤子** @return*/TrousersService createTrouser();}

定义抽象工厂需要制作抽象产物(上衣、下装)

public interface ClothesService {/*** 短袖*/void shortSleeve();/*** 衬衫*/void shirt();}
public interface TrousersService {/*** 牛仔裤*/void jeans();/*** 短裤*/void shorts();}

定义具体工厂(春季、夏季)

@Service
@Slf4j
public class SpringWearFactory implements WearFactory {@Resource(name = "springClothesServiceImpl")private ClothesService clothesService;@Resource(name = "springTrousersServiceImpl")private TrousersService trousersService;@Overridepublic ClothesService createClothe() {return clothesService;}@Overridepublic TrousersService createTrouser() {return trousersService;}
}
@Service
@Slf4j
public class SummerWearFactory implements WearFactory {@Resource(name = "summerClothesServiceImpl")private ClothesService clothesService;@Resource(name = "summerTrousersServiceImpl")private TrousersService trousersService;@Overridepublic ClothesService createClothe() {return clothesService;}@Overridepublic TrousersService createTrouser() {return trousersService;}}

定义工厂生产零件(上衣、下装)

@Service
@Slf4j
public class SpringClothesServiceImpl implements ClothesService {@Overridepublic void shortSleeve() {System.out.println("制作了---春季款---短袖");}@Overridepublic void shirt() {System.out.println("制作了---春季款---衬衫");}
}
@Service
@Slf4j
public class SpringTrousersServiceImpl implements TrousersService {@Overridepublic void jeans() {System.out.println("制作了---春季款---牛仔裤");}@Overridepublic void shorts() {System.out.println("制作了---春季款---短裤");}}
@Service
@Slf4j
public class SummerClothesServiceImpl implements ClothesService {@Overridepublic void shortSleeve() {System.out.println("制作了---夏季款---短袖");}@Overridepublic void shirt() {System.out.println("制作了---夏季款---衬衫");}}
@Service
@Slf4j
public class SummerTrousersServiceImpl implements TrousersService {@Overridepublic void jeans() {System.out.println("制作了---夏季款---牛仔裤");}@Overridepublic void shorts() {System.out.println("制作了---夏季款---短裤");}}

样例三(工厂关于小米和华为的生产)

定义抽象工厂(制造工厂)

public interface ProductFactory {/*** 创建一个抽象手机** @return*/PhoneService createPhone();/*** 创建一个抽象路由器** @return*/RouterService createRouter();}

定义抽象工厂需要制作抽象产物(手机、路由器)

public interface PhoneService {/*** 开机*/void power();/*** 关机*/void shutdown();/*** 打电话*/void call();}
public interface RouterService {/*** 开机*/void power();/*** 关机*/void shutdown();/*** 路由器 设置*/void setting();}

定义具体工厂(小米工厂、华为工厂)

@Service
@Slf4j
public class XiaomiProductFactory implements ProductFactory {@Resource(name = "xiaomiPhoneServiceImpl")private PhoneService phoneService;@Resource(name = "xiaomiRouterServiceImpl")private RouterService routerService;@Overridepublic PhoneService createPhone() {return phoneService;}@Overridepublic RouterService createRouter() {return routerService;}}
@Service
@Slf4j
public class HuaweiProductFactory implements ProductFactory {@Resource(name = "huaweiPhoneServiceImpl")private PhoneService phoneService;@Resource(name = "huaweiRouterServiceImpl")private RouterService routerService;@Overridepublic PhoneService createPhone() {return phoneService;}@Overridepublic RouterService createRouter() {return routerService;}}

定义工厂生产零件(手机、路由器)

@Service
@Slf4j
public class XiaomiPhoneServiceImpl implements PhoneService {@Overridepublic void power() {System.out.println("小米手机开机");}@Overridepublic void shutdown() {System.out.println("小米手机关机");}@Overridepublic void call() {System.out.println("小米手机打电话");}
}
@Service
@Slf4j
public class XiaomiRouterServiceImpl implements RouterService {@Overridepublic void power() {System.out.println("小米路由器开机");}@Overridepublic void shutdown() {System.out.println("小米路由器关机");}@Overridepublic void setting() {System.out.println("小米路由器开始设置wifi");}
}
@Service
@Slf4j
public class HuaweiPhoneServiceImpl implements PhoneService {@Overridepublic void power() {System.out.println("华为手机开机");}@Overridepublic void shutdown() {System.out.println("华为手机关机");}@Overridepublic void call() {System.out.println("华为手机打电话");}
}
@Service
@Slf4j
public class HuaweiRouterServiceImpl implements RouterService {@Overridepublic void power() {System.out.println("华为路由器开机");}@Overridepublic void shutdown() {System.out.println("华为路由器关机");}@Overridepublic void setting() {System.out.println("华为路由器开始设置wifi");}}

测试样例

@Slf4j
@SpringBootTest(classes = AbstractFactoryApplication.class)
public class TestAbstractFactory {@Resourceprivate Map<String, HtmlFactory> htmlFactoryMap;@Resourceprivate Map<String, ProductFactory> productFactoryMap;@Resourceprivate Map<String, WearFactory> wearFactoryMap;@Testpublic void testPage() {for (Map.Entry<String, HtmlFactory> map : htmlFactoryMap.entrySet()) {log.info("这是 : {} 工厂", map.getKey());System.out.println(map.getValue().createTray().makeHTML());}}@Testpublic void testProduct() {for (Map.Entry<String, ProductFactory> map : productFactoryMap.entrySet()) {log.info("这是 : {} 工厂", map.getKey());ProductFactory value = map.getValue();PhoneService phone = value.createPhone();RouterService router = value.createRouter();log.info("phone begin");phone.power();phone.call();phone.shutdown();log.info("router begin");router.power();router.setting();router.shutdown();}}@Testpublic void testWear() {for (Map.Entry<String, WearFactory> map : wearFactoryMap.entrySet()) {log.info("这是 : {} 工厂", map.getKey());WearFactory value = map.getValue();ClothesService clothe = value.createClothe();TrousersService trouser = value.createTrouser();log.info("clothe begin");clothe.shortSleeve();clothe.shirt();log.info("trouser begin");trouser.jeans();trouser.shorts();}}}

总结

  如果现在要建立一个工厂是非常容易能创建的,但如果要增加新的零件每个工厂都要实现零件制作方法,因此非常麻烦。
  一句话表述:易于增加具体的工厂,难以增加新的零件

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

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

相关文章

经典文献阅读之--LiDAR-based 4D Occupancy Completion and Forecasting(基于激光雷达的4D占用补全与预测)

0. 简介 本文介绍了基于激光雷达的4D占用补全与预测。场景补全与预测是自动驾驶汽车等移动智能体研究中的两个常见的感知问题。现有的方法独立地处理这两个问题&#xff0c;导致这两方面的感知是分开的。在《LiDAR-based 4D Occupancy Completion and Forecasting》中&#xf…

Llama3中文聊天项目全能资源库

Llama3 中文聊天项目综合资源库&#xff0c;集合了与Lama3 模型相关的各种中文资料&#xff0c;包括微调版本、有趣的权重、训练、推理、评测和部署的教程视频与文档。1. 多版本支持与创新&#xff1a;该仓库提供了多个版本的Lama3 模型&#xff0c;包括基于不同技术和偏好的微…

01 | 为什么需要消息队列?

哪些问题适合使用消息队列来解决&#xff1f; 1. 异步处理 2. 流量控制 使用消息队列隔离网关和后端服务&#xff0c;以达到流量控制和保护后端服务的目的。 3. 服务解耦 无论增加、减少下游系统或是下游系统需求如何变化&#xff0c;订单服务都无需做任何更改&#xff0c…

免费的GPT4终于要来了!OpenAI直播发布会详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

sql注入中的替换技巧。

目录 1&#xff1a;注释的替换 2&#xff1a;空格替换 3&#xff1a;大小写混合绕过及双写绕过 4&#xff1a;等号的绕过 5&#xff1a;单双引号的绕过 1&#xff1a;注释的替换 注释在sql注入中非常重要&#xff0c;因为会使用它来闭合我们注入的sql语句。 当以get方式提…

通过钉钉卡片进行工单审批

我们通常通过钉钉机器人来发送通知&#xff0c;提醒审批人名下有待办工单需要处理。这种通知方式仅能提醒审批人到ITSM中处理&#xff0c;审批人需要打开电脑登陆平台处理&#xff0c;我们就考虑是否能有一种方式能够满足移动端审批&#xff1f; 这里我们可以使用ITSM的移动端版…

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…

Django模型进阶

接上一节 4.查询数据 在Django中&#xff0c;正向查询&#xff08;Forward Query&#xff09;和反向查询&#xff08;Reverse Query&#xff09;是ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;中用于处理数据库表间关系时的两种查询方式&a…

江门水文分局开展防灾减灾主题宣传活动

5月11日&#xff0c;第16个全国防灾减灾日到来之际&#xff0c;广东省水文局江门水文分局联合江门市五邑义工联合会直属义工服务总队&#xff08;亲子服务队&#xff09;在江门市万达广场举办了一场别开生面的防灾减灾主题宣传活动&#xff0c;进一步培育孩子们的防灾减灾的意识…

FPGA verilog LVDS通信协议笔记

一幅图胜过千言万语 直接开始挫代码&#xff0c;先写top.v。 module top();reg clk; // 生成时钟的寄存器 reg rst; // 生成复位信号的寄存器initial clk 1; // 初始值取1 always #1 clk ~clk; //1ns取反一次initial begin // 复位信号&#xff0c;先0&#xff0c;过段时间赋…

4.2 文本相似度(三)

换个思路&#xff0c;再训练一次。 1 基本框架 试想&#xff0c;如果有一个语句需要从预料库中匹配&#xff0c;每一次匹配都会伴随着大量的耗时&#xff1a; 一次匹配20ms, 1 000 000次呢&#xff0c;1 000 000 *20/ 1000 20 000S &#xff5e;5.56H。效率极其的低&#x…

【PB案例学习笔记】-01创建应用、窗口与控件

写在前面 这是PB案例学习笔记系列文章的第一篇&#xff0c;也是最基础的一篇。后续文章中【创建程序基本框架】部分操作都跟这篇文章一样&#xff0c; 将不再重复。该系列文章是针对具有一定PB基础的读者&#xff0c;通过一个个由浅入深的编程实战案例学习&#xff0c;提高编…