通俗易懂的java设计模式(5)-抽象工厂模式模式

news2024/11/23 21:09:18

什么是抽象工厂模式?

抽象工厂模式,可以说是工厂模式的升级版

关于工厂模式:通俗易懂的工厂模式

抽象工厂:围绕着一个超级工厂去创建其他的工厂,这个超级工厂也被称为工厂的工厂,这个设计模式属于创建型模式,提供了一种创建对象的最佳方式

  • 相关的概念

产品族:某个品牌下面的所有产品,比如苹果下的手机、平板就是同一产品族

产品等级:不同品牌下面的同种产品,比如苹果的手机和华为的手机就是同一产品等级

简单的代码实现

场景描述:苹果和华为都有手机产品和平板产品,在客户端调用时,我们需要直接用工厂接口创建需要的苹果和华为工厂,从而拿到想要的产品

下面代码的整体架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EsIHoBk-1672990742561)(documents/笔记/images/image-20230106152453596.png)]

  • 手机和平板是两个产品,所以我们先创建两个抽象产品接口
/**
 * 手机产品
 */
public interface PhoneProduct {
    void start();
}
/**
 * 平板产品
 */
public interface PadProduct {
    void start();
}
  • Iphone,Ipad,HuaweiMate,HuaweiPad四个产品的具体产品实现类
public class Iphone implements PhoneProduct {
    @Override
    public void start() {
        System.out.println("您正在使用iphone系列产品");
    }
}
public class Ipad implements PadProduct{
    @Override
    public void start() {
        System.out.println("您正在使用ipad系列产品");
    }
}
public class HuaweiMate implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("您正在使用HuaweiMate系列产品");
    }
}
public class HuaweiPad implements PadProduct{
    @Override
    public void start() {
        System.out.println("您正在使用HuaweiPad系列产品");
    }
}
  • 接下来就是超级工厂的抽象实现
public interface SuperProductFactory {
    //获取手机产品
    PhoneProduct getphoneProduct();
    //获取平板产品
    PadProduct getpadProduct();
}
  • 苹果和华为是两个不同的品牌,所以他们两个各自都有一个各自的工厂类
public class AppleFactory implements SuperProductFactory{
    @Override
    public PhoneProduct getphoneProduct() {
        return new Iphone();
    }

    @Override
    public PadProduct getpadProduct() {
        return new Ipad();
    }
}
public class HuaweiFactory implements SuperProductFactory{
    @Override
    public PhoneProduct getphoneProduct() {
        return new HuaweiMate();
    }

    @Override
    public PadProduct getpadProduct() {
        return new HuaweiPad();
    }
}
  • 最后就是客户端了,可以直接用超级工厂来创建品牌工厂,从而得到需要的产品
public class Client {
    public static void main(String[] args) {
        /**
         * 利用苹果工厂,得到苹果产品
         */
        SuperProductFactory apple = new AppleFactory();

        PhoneProduct iphone = apple.getphoneProduct();
        PadProduct ipad = apple.getpadProduct();
        iphone.start();
        ipad.start();

        /**
         * 利用华为工厂,得到华为产品
         */
        SuperProductFactory huawei = new HuaweiFactory();
        PhoneProduct huaweiMate = huawei.getphoneProduct();
        PadProduct huaweiPad = huawei.getpadProduct();
        huaweiMate.start();
        huaweiPad.start();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12QQ92xV-1672990742562)(documents/笔记/images/image-20230106144838502.png)]

抽象工厂模式的优缺点

  • 优点:产品等级容易扩展

假设我们现在有一个新的品牌三星,也可以生产手机和平板,我们扩展的时候是不用修改原来的代码的,只需要新增工厂实现类和产品实现类即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2dETkXX-1672990742563)(documents/笔记/images/image-20230106153015114.png)]

  • 缺点:产品族难扩展

假如说苹果和华为除了手机和平板之外扩充了新的业务,又开始造耳机了,那么我们不仅要增加产品接口,还需要修改顶层的工厂类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6r1WkUy-1672990742563)(documents/笔记/images/image-20230106153300721.png)]

抽象工厂模式在java中的应用

  • 在spring中,BeanFactory是所有工厂的父类,这样就可以根据不同的策略调用getBean方法,从而获取具体的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyWhbnPN-1672990742563)(documents/笔记/images/image-20230106153822258.png)]
外链图片转存中...(img-t6r1WkUy-1672990742563)]

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

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

相关文章

【小5聊】回看2022,展望2023,分享我的年度总结和感想,在一个行业十年,坚持下去你就是这个行业的专家

2022年,已成为过去!2023年,TA已悄然而至! 非常感谢CSDN提供的技术平台,很早就关注了C站,11年的时候,当时用的是163邮箱注册的账号,也是主要用来找资料看文章。 18年的时候&#xff0…

八、k8s 数据存储

文章目录1 数据存储介绍1.1 基本存储1.1.1 EmptyDir1.1.2 HostPath1.1.3 NFS2 高级存储2.1 PV2.2 PVC2.3 生命周期3 配置存储3.1 ConfigMap3.2 Secret1 数据存储介绍 在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时&am…

基础数据结构——队列和栈

目录 一、队列 1、循环队列 2、Python队列的三种实现方式 3、例题——队列操作 4、优先队列 (1)基本操作 (2)例题(lanqiaoOJ题号1228) 二、栈 1、用 list 实现栈 2、用 collections.deque 实现栈…

【知识图谱导论-浙大】第一章:知识图谱概论

背景 2022年,随着在自然语言处理方向的深入,我逐渐开始对知识图谱在问答、搜索、推荐等领域的应用产生浓厚的兴趣。自己也通过书籍、博文、论文等对知识图谱有所了解,也通过中文开放知识图谱对中文知识图谱在各领域的发展有了深刻的认识。知…

将非负整数num转换为对应的英文表达(C++实现)—— 力扣第273号题的加强。

【问题描述】 将非负整数num转换为对应的英文表达式。 (样例1) 输入:25 输出:Twenty Five (样例2) 输入:12,315 输出:Twelve Thousand Three Hundred (and) Fifteen 备注:and可省略 另备注:偶然发…

(八)devops持续集成开发——jenkins流水线发布一个docker版的后端maven项目

前言 本节内容我们使用jenkins的流水化工具发布一个后端docker项目,实现后端项目的容器化部署。在开始本节内容之前,我们需要在生产环境安装好docker环境并且能够联网下载镜像。通过jenkins的流水化工具,实现代码拉取,maven打包编…

【java篇】反射机制简单理解

学到JDBC后,使用到反射机制,所以回顾反射机制相关知识点; 文章目录 文章目录 什么是反射机制? 如何理解反射呢? 总结 一、Java反射机制是什么? 二、Java反射机制中获取Class的三种方式及区别? 三…

【目标检测】EfficientDet

1、论文 题目:《EfficientDet: Scalable and Efficient Object Detection》 论文地址: https://arxiv.org/pdf/1911.09070.pdf 代码地址: https://github.com/bubbliiiing/efficientdet-pytorch 2、摘要 Google Brain团队在CVPR 2020上提出…

Liunx 对函数库的理解

一、前言 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时…

PCB入门学习— CHIP类PCB封装的创建

目录 2.12 原理图PCB封装完整性的检查 3.1 CHIP类PCB封装的创建 学习目录 2.12 原理图PCB封装完整性的检查 然后点接受变更。 www.digikey.com搜索规格的网站。 3.1 CHIP类PCB封装的创建 放焊盘——确定大小——画丝印——确定原点EFC。 创建一个PCB元件库,Ct…

React(coderwhy)- 07(路由)

认识React-Router 认识前端路由 ◼ 路由其实是网络工程中的一个术语:  在架构一个网络时,非常重要的两个设备就是路由器和交换机。  当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都会用到路由器&#x…

红黑树:比AVL抽象、自由的、更广泛的近似平衡树

RBT与AVL树的比较 AVL:高度要求差不超过1红黑树:RBT要求最长路径不超过短路径的2倍,不需要像AVL一样太平衡,稍微自由,所以旋转较少。 AVL和RBT树性能比较: 插入同样的数据,AVL树旋转更多&…

本地生活配送行业黑马,带你一键读懂闪飞侠

电商的黄金十年已经过去,本地生活的黄金市场才刚刚开启,本地生活市场的增长对同城配送的影响得有多大?2020年的新冠疫情,爆发了同城即时配送的投资新机遇!即时配送用户已超5亿。而随着即时配送行业的广泛应用&#xff…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第三篇】(持续更新中)

在第二篇我们主要学习了路径别名,配置.env环境变量,封装axios请求,以及使用api获取数据后渲染 Element Plus表格 本期需要掌握的知识如下: 封装列表模糊查询组件实现新增 编辑 删除 模糊查询 重置 功能实现表单校验功能实现组件间传值 下期…

Compose跨平台第一弹:体验Compose for Desktop

前言 Compose是Android官方提供的声明式UI开发框架,而Compose Multiplatform是由JetBrains 维护的,对于Android开发来说,个人认为学习Jetpack Compose是必须的,因为它会成为Android主流的开发模式,而compose-jb作为一…

TikTok三大流行趋势 钛动带你看懂TikTok

武汉瑞卡迪电子商务有限公司:近日,TikTok for Business发布了《Whats Next 2023 TikTok 全球流行趋势报告》,就2023年TikTok三大趋势主题进行了介绍。 钛动科技作为TikTok官方授权代理商,是TikTok生态服务最齐全的出海服务商,凭借出色的技术与服务能力,钛动斩获了T…

论 G1 收集器的架构和如何做到回收时间用户设定

目录G1 概念JVM的内存分代假设让用户设置应用的暂停时间G1 概念 G1其实是Garbage First的意思,它不是垃圾优先的意思,而是优先处理那些垃圾多的内存块的意思。 在大的理念上,它还是遵循JVM的内存分代假设。 JVM的内存分代假设 JVM的内存分代…

https如何加密解密?

背景 我们知道,https,在网络传输中,加密。具体来说是数据加密。//客户端和服务器,写数据的时候,都会加密。即1.客户端——》服务器 2.服务器——》客户端。 如何加密 解密? 加密解密 想要加密和解密&am…

【Mysql篇】数据库事务

目录 数据库事务数据库事务介绍 JDBC事务处理 事务的ACID属性 数据库的并发问题 数据库提供的4种事务隔离级别: 在MySql中设置隔离级别 数据库事务数据库事务介绍 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理(…

Day1. Spring

1 课程描述IoC基础容器,主要涉及Bean对象的管理。AOP面向切面编程,主要涉及切面配置,声明式事务控制Spring整合Web环境。Web层解决方案-SpringMVC.1.1 IoC、DI和AOP思想的提出由于传统的JavaWeb出现的问题:问题1:层与层…