设计模式详解---抽象工厂模式

继续前言,工厂模式中抽象工厂模式的讲解:

1. 前面的工厂模式有啥问题?

前面的工厂模式有这么个问题:一个产品就给了一个工厂,这样子如果产品变多,系统就会很复杂:

2. 解决方法

我们可以按照手机、电脑这两种分类来定义抽象出工厂,这样子避免了工厂子类越来越多、系统越来越复杂的问题,像这样把产品类按照一定的规则进行分组,组内不同产品对应于同一工厂类不同方法的设计模式,就是抽象工厂模式( Abstract Factory Pattern )

3. 代码设计

按照上述逻辑,我们就以手机为例,设计一下代码:

/*** @Author: stukk* @Description: 苹果的产品接口* @DateTime: 2023-12-15 12:03**/
public interface IphoneProduct {void showIphone();
}/*** @Author: stukk* @Description: 苹果手机* @DateTime: 2023-12-15 12:07**/
public class Iphone implements IphoneProduct {@Overridepublic void showIphone() {System.out.println("我是苹果手机");}
}/*** @Author: stukk* @Description: 苹果电脑* @DateTime: 2023-12-15 12:07**/
public class Mac implements IphoneProduct {@Overridepublic void showIphone() {System.out.println("我是苹果电脑");}
}/*** @Author: stukk* @Description: 小米的产品接口* @DateTime: 2023-12-15 12:03**/
public interface MiProduct {void showMi();
}/*** @Author: stukk* @Description: 小米手机产品* @DateTime: 2023-12-15 12:04**/
public class MiPhone implements MiProduct {@Overridepublic void showMi() {System.out.println("我是小米手机....");}
}/*** @Author: stukk* @Description: 小米电脑产品* @DateTime: 2023-12-15 12:04**/
public class MiComputer implements MiProduct {@Overridepublic void showMi() {System.out.println("我是小米电脑....");}
}/*** @Author: stukk* @Description: 工厂接口* @DateTime: 2023-12-15 12:09**/
public interface Factory {
//    创建苹果的产品IphoneProduct createIphone();
//    创建小米的产品MiProduct createMi();}* @Author: stukk* @Description: 电脑工厂具体类* @DateTime: 2023-12-15 12:10**/
public class ComputerFactory implements Factory {@Overridepublic IphoneProduct createIphone() {return new Mac();}@Overridepublic MiProduct createMi() {return new MiComputer();}
}/*** @Author: stukk* @Description: 手机工厂具体类* @DateTime: 2023-12-15 12:10**/
public class PhoneFactory implements Factory {@Overridepublic IphoneProduct createIphone() {return new Iphone();}@Overridepublic MiProduct createMi() {return new MiPhone();}
}/*** @Author: stukk* @Description: 客户端* @DateTime: 2023-12-15 12:12**/
public class abstractFactoryExample {public static void main(String[] args) {
//        创建手机Factory factory = new PhoneFactory();IphoneProduct iphone = factory.createIphone();MiProduct mi = factory.createMi();iphone.showIphone();mi.showMi();
//        创建电脑factory = new ComputerFactory();IphoneProduct mac = factory.createIphone();MiProduct miComputer = factory.createMi();mac.showIphone();miComputer.showMi();}}

4. 工厂模式的实际应用

工厂模式在实际开发中也有很多的应用场景:

  1. 依赖注入(Dependency Injection):工厂模式用于实现依赖注入,通过工厂类来创建和提供依赖的对象。这样可以实现松耦合的组件之间的依赖关系,方便进行单元测试和代码维护。

  2. 多态对象的创建:工厂模式可以根据条件或参数的不同创建不同的具体对象,实现多态的对象创建。这样可以根据具体需求动态地创建不同类型的对象,提供更大的灵活性和可扩展性。

  3. 插件系统:工厂模式可以用于实现插件系统,通过工厂类动态地加载和创建插件对象。这样可以方便地扩展应用的功能,允许用户根据需求选择和切换不同的插件实现。

  4. 数据库访问:工厂模式可以用于创建数据库访问对象,根据不同的数据库类型创建相应的数据库连接、查询执行器等对象。这样可以实现数据库访问的抽象和统一管理,提供更好的可维护性和扩展性。

 5.总结

普通工厂模式:

        普通工厂模式定义了唯一工厂类,通过用户传入的type参数,使用if-else来生成返回对应来创建对象。

工厂方法模式:

        工厂方法模式定义了给每个产品都定义了工厂类,用户可以直接调用对应的工厂类中的方法来创建对象,换句话说就是使用多态来解决这个if-else过多的问题

抽象工厂模式:

        抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。

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

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

相关文章

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行 实现目的:代码在RAM中调试完成后,就需要将其固化下载到FLASH中,但是FLASH中运行所有程序的话会存在计算或程序运行时间过长的问题,故还需要将部分代…

Sublime Text 3 解决中文乱码问题

Sublime Text 3 解决中文乱码问题 一、引言二、主要内容1. 初识 ConvertToUTF8 插件2. 安装 ConvertToUTF8 插件3. 中文乱码问题解决 三、总结 一、引言 在 《Sublime Text 3配置C/C开发环境》 博文中,Huazie 带大家利用 Sublime Text 3 配置了 C/C 开发环境&#…

手把手教你使用zabbix5.0设置企业微信告警

一、环境要求 需要准备2台虚拟机,镜像是centos7,保证2台虚拟机之间可以正常通信,并且可以正常连接外网。 systemctl stop firewalld && systemctl disable firewalld setenforce 0 && sed -i ‘/SELINUX/s/enforcing/disable…

【infiniband】安装驱动

安装 InfiniBand 驱动包通常包括几个步骤,但是可能会有所不同,取决于使用的操作系统和具体的硬件。以下是在 Linux 系统上安装 InfiniBand 驱动的通用步骤: 1.检查硬件和操作系统兼容性 确保服务器硬件支持 InfiniBand,并查看驱动…

详解Maven如何打包SpringBoot工程

目录 一、spring-boot-maven-plugin详解 1、添加spring-boot-maven-plugin插件到pom.xml 2、配置主类(Main Class) 3、配置打包的JAR文件名 4、包含或排除特定的资源文件 5、指定额外的依赖项 6、配置运行参数 7、自定义插件执行阶段 二、Maven打…

LeetCode Hot100 23.合并K个升序链表

题目: 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 方法:分治,类似于归并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return mer…

canvas中实现画布内元素的拖拽(下)

在上篇实现基础上,实现仅能在画布区域内移动 const canvas document.createElement(canvas) canvas.width 400 canvas.height 400 canvas.id canvas document.body.appendChild(canvas) let ctx canvas.getContext(2d) //画笔// 状态标志 const statusConfig …

arp欺骗原理以及实现方式

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢? 原理: 这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内&…

C/C++ 有效的括号判断

题目: 给定一个只包括 (,),{,},[,]的字符串s,判断字符串是否有效。 约束: 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。…

【六】python观察者设计模式

6.1行为型模式简介 观察者设计模式是最简单的行为型模式之一,所以我们先简单了解一下行为型模式 创建型模式的工作原理是基于对象的创建机制的。由于这些模式隔离了对象的创建细 节,所以使得代码能够与要创建的对象的类型相互独立。结构型模式用于设计对象和类的结…

Python GUI教程:轻松构建用户界面

大家好,从网络开发到数据科学,Python被广泛应用于各个领域。本文将探索Python内置的用于创建图形用户界面(GUI)的库:Tkinter。无论是初学者还是经验丰富的开发者,了解如何创建Python GUI都可以增强构建交互…

Makefile基本指令

语法规则 目标 ... : 依赖 ...命令1命令2. . .1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。 2、默认情况下Makefile的第一个目标为终极目…

系统接口未找到报404异常统一返回处理

上篇博客:异常处理返回结构体,做到全局统一,仍然会出现一些情况。 针对未找到接口爆出404异常,返回结构体如果没有处理的话会变成下面这样,不会走全局异常处理,这样的话就没有完全做到全局异常统一处理。 …

es模板和索引简单操作简介

一、模板 1、创建模板 (1)请求url http://127.0.0.1:9201/_template/template_test (2)请求方式 PUT (3)请求体 { "index_patterns": ["test*"], "settings": { …

并发相关参数指标

指标 1、TPS和QPS 一、TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS CAPS 每个呼叫平均TPS&…

前端发送请求之参数处理---multipart/form-data与application/x-www-form-urlencoded

Content-Type就是指 HTTP 发送信息至服务器时的内容编码类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。 其实前后端发送请求的方式有 text/plain、application/json、application/x-www-form-urlencoded、 multipart/form-data等&…

Axie Infinity 之后,Ronin 的潜力何在?

作者:stellafootprint.network 数据来源:Ronin Dashboard 备受欢迎的 Web3 游戏 Pixels 在 2023 年 10 月下旬从 Polygon 迁移到了专为游戏设计的区块链 Ronin。Pixels 此前作为 Polygon 上活跃用户(钱包数量)最多的 Web3 游戏&…

iPhone手机中备忘录如何改变字体颜色

作为一名iPhone用户,我经常使用手机备忘录来记录生活中的点点滴滴。这样,我的大脑就能从繁琐的记忆任务中解脱出来,专注于更重要的事情。 而且,我有一个特别的习惯,那就是使用不同颜色的字体来区分不同的备忘录。这样…

学习黑马vue

项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…

什么是 Spring 框架?

Spring 框架是一个开源的、轻量级的企业级应用框架,用于构建 Java 应用程序。它提供了全面的基础设施支持,以简化企业级应用的开发。Spring 的核心目标是通过促进良好的设计原则和编程习惯来提高 Java 开发人员的效率和系统的可维护性。 Spring 框架的主…