运用抽象工厂模式实现多个产品族的独立创建与组合管理

抽象工厂模式(Abstract Factory Pattern) 是一种软件设计模式,属于创建型设计模式类别,主要用于处理对象的创建过程,特别是在应对具有多个相关或相互依赖对象的特定上下文时。该模式的主要目的是将一组相关或者相互依赖的对象的创建过程封装到一个单独的接口中,使得客户端可以通过统一的方式来创建并使用这些对象,同时隐藏了具体的实现细节。
抽象工厂模式的角色包括:

  • 抽象工厂(Abstract Factory):
    定义了一组用于创建不同但相关或相互依赖对象的接口(即产品族)。它不直接创建产品对象,而是声明一些方法,让子类来实现这些产品的创建逻辑。
  • 具体工厂(Concrete Factory):
    实现了抽象工厂接口,为每一种产品族提供了实际的创建逻辑。根据传入的参数或其他条件,具体工厂会创建相应的产品对象。
  • 抽象产品(Abstract Product):
    定义了一组产品对象的接口,这可以是接口或抽象类,它是各种具体产品对象所共有的公共接口。
  • 具体产品(Concrete Product):
    每个具体产品都是抽象产品的一个实现,它们构成了一个产品族。具体工厂通过创建这些具体产品来满足客户端的需求。

举例来说,假设有一个图形编辑器项目,其中存在两种图形样式(如“圆形”、“矩形”等几何图形)以及多种颜色风格(如“红色系”、“蓝色系”等)。抽象工厂可以定义创建不同形状和颜色风格的方法,而具体工厂则可以创建某一特定颜色风格下的各种形状实例,这样客户端无需关心具体的实现细节,只需调用抽象工厂提供的接口即可得到所需的产品对象。

代码示例

下面是一个基于Java的抽象工厂模式的简单代码实现示例,以创建不同类型的汽车为例,我们有普通汽车和电动汽车两类,每类汽车又有轿车和SUV两种车型。这里展示了如何使用抽象工厂来创建不同类型的具体汽车产品。
汽车分为电动和普通的轿车,suv:

// 抽象产品:汽车接口
interface Car {void drive();
}// 具体产品:普通轿车
class NormalCar implements Car {@Overridepublic void drive() {System.out.println("驾驶普通轿车");}
}// 具体产品:普通SUV
class NormalSUV implements Car {@Overridepublic void drive() {System.out.println("驾驶普通SUV");}
}// 具体产品:电动汽车轿车
class ElectricCar implements Car {@Overridepublic void drive() {System.out.println("驾驶电动汽车轿车");}
}// 具体产品:电动汽车SUV
class ElectricSUV implements Car {@Overridepublic void drive() {System.out.println("驾驶电动汽车SUV");}

抽象汽车工厂:

interface CarFactory {Car createCar();SUV createSUV();
}

普通汽车工厂:

class NormalCarFactory implements CarFactory {@Overridepublic Car createCar() {return new NormalCar();}@Overridepublic SUV createSUV() {return new NormalSUV();}
}

电动汽车工厂:

class ElectricCarFactory implements CarFactory {@Overridepublic Car createCar() {return new ElectricCar();}@Overridepublic SUV createSUV() { // 假设SUV也有一个对应的接口return new ElectricSUV();}
}

调用:

public class Client {public static void main(String[] args) {CarFactory normalFactory = new NormalCarFactory();CarFactory electricFactory = new ElectricCarFactory();Car normalCar = normalFactory.createCar();Car electricCar = electricFactory.createCar();normalCar.drive();electricCar.drive();// 同理可以创建SUV并驾驶}
}

CarFactory 是抽象工厂,NormalCarFactory 和 ElectricCarFactory 是具体工厂,Car 和 SUV 是抽象产品,而 NormalCar、NormalSUV、ElectricCar、ElectricSUV 则是具体产品。通过抽象工厂,客户端可以根据需求选择创建何种类型的具体产品。

区别于简单工厂

简单工厂模式专注于单一产品种类的创建,易于理解和实现,但当产品种类增多时,工厂类可能会变得庞大和难以维护;而抽象工厂模式旨在解决多系列产品对象的创建问题,能够更好地支持产品族的扩展,但它引入了更多的抽象层和类结构。

抽象工厂模式的缺点

  1. 增加系统复杂性:随着产品族数量的增长,需要创建的抽象工厂及其实现类的数量也会增加,导致系统变得更加复杂,不易于理解和维护。
  2. 扩展受限:如果要添加新产品,则不仅要在抽象工厂接口中添加新的方法,还需要修改所有的具体工厂类,这违反了开闭原则,增加了系统拓展的难度。
  3. 过度设计风险:若系统中的产品之间关联并不紧密,或者客户程序仅仅需要独立地使用某个产品,此时使用抽象工厂模式就会显得过于复杂,有可能造成设计过度。
  4. 无法识别新创建的产品:抽象工厂只能创建预先设定好的产品集合,若需新增一个不属于现有产品族的新产品,则原有抽象工厂很难进行适应,需要重构整个体系结构。

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

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

相关文章

SpringMvc处理器方法的返回值

1、返回ModelAndView ModelAndView中的视图会经过你视图解析器处理得到真实的jsp文件页面并且跳转。 RequestMapping("test01")public ModelAndView test01() {ModelAndView mv new ModelAndView();// 携带数据mv.addObject("teamName", "牛逼&quo…

AI绘图:Controlnet在ComfyUI中的使用教程:提升Stable Diffusion可控性

前言 Controlnet是Stable Diffusion中一个至关重要的功能,它极大地增强了图像生成的可控性。通过引入额外的条件,Controlnet使我们能够更精确地控制生成的图像内容。本教程将详细介绍如何在ComfyUI中使用Controlnet,从而让你的创作过程更加灵…

2012年认证杯SPSSPRO杯数学建模B题(第二阶段)节能减排全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 节能减排、抑制全球气候变暖 B题 白屋顶计划 原题再现: 第二阶段问题   虽然环境学家对地球环境温度的改变有许多种不同观点,但大多数科学家可以达成一个基本的共识:近年来人类的活动,尤指二氧…

云存储中常用的相同子策略的高效、安全的基于属性的访问控制的论文阅读

参考文献为2022年发表的Efficient and Secure Attribute-Based Access Control With Identical Sub-Policies Frequently Used in Cloud Storage 动机 ABE是实现在云存储中一种很好的访问控制手段,但是其本身的计算开销导致在实际场景中应用收到限制。本论文研究了…

ESP32学习---ESP-NOW(一)

ESP32学习---ESP-NOW(一) 官网简介arduino 官网简介 首先看官网的介绍:https://www.espressif.com.cn/zh-hans/solutions/low-power-solutions/esp-now ESP-NOW 是乐鑫定义的一种无线通信协议,能够在无路由器的情况下直接、快速…

【Java多线程(4)】案例:设计模式

目录 一、什么是设计模式? 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式? 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…

5米分辨率数字高程模型(DEM)的制作

在现代科技的驱动下,地理信息系统(GIS)和遥感技术已经取得了惊人的进展。其中一项令人瞩目的技术就是5米分辨率数字高程模型(DEM)的制作,它是基于多颗高分辨率卫星数据为原始数据,借助智能立体模…

C语言编写Linux的Shell外壳

目录 一、输出命令行 1.1 了解环境变量 1.2 获取用户名、主机名、当前路径 1.3 缓冲区改进MakeCommandLine 二、获取用户命令 2.1 读取函数的选择 2.2 细节优化 2.3 返回值 三、指令和选项分割 3.1 strtok 函数 3.2 分割实现 四、执行命令 4.1 fork 方法 4.2 进…

0.17元的4位数码管驱动芯片AiP650,支持键盘,还是无锡国家集成电路设计中心某公司的

推荐原因:便宜的4位数码管驱动芯片 只要0.17元,香吗?X背景的哦。 2 线串口共阴极 8 段 4 位 LED 驱动控制/7*4 位键盘扫描专用电路 AIP650参考电路图 AIP650引脚定义

scratch小动物的晚会 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析

目录 scratch小动物的晚会 一、题目要求 1、准备工作 2、功能实现 二、案例分析

51单片机入门_江协科技_20.1_Proteus串口仿真

1.为了解决51单片机学习过程中在Proteus中的串口仿真的问题,需要在Proteus中建立串口仿真的环境(目前Proteus安装在Win7x64虚拟机环境中; 2. 在CSDN中找到VSPD下载地址,在虚拟机中进行VSPD的安装,具体链接地址如下&am…

mac电脑下pip安装库后,仍然提示command not found

如:pip install httprunner,安装成功后输入hrun -V 提示“command not found”。 造成这个问题的原因是PATH环境变量的问题,因为使用的是homebrew安装的python,导致pip bin目录的环境变量没注册上。 解决办法是将python bin目录加…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签: 1.块级元素: 2.内联元素: 3.元素嵌套: 4.元素转换: 示例如下: 2.内联框架: 前言: 示例如下: 3.布局: 4.头部标签: 前言: 说明&…

【Elasticsearch配置秘籍】详解config/elasticsearch.yml,解锁关键参数与实战应用

Elasticsearch的强大性能与灵活性,很大程度上得益于其细致入微的配置选项。作为核心配置文件,config/elasticsearch.yml扮演着至关重要的角色。本文将深度剖析该文件中的重要参数,结合实例说明其作用与应用场景,助您定制最适合业务…

【蓝桥杯-Even Parity】

蓝桥杯-Even Parity 洛谷 UVA11464 Even Parity 暴力思路: 去遍历每个元素,如果不符合要求则翻转 时间复杂度大概在O(2^(nn) nn) 改进思路: 先去枚举确定第一行(第一行得合法&…

反截屏控制技术对于防止数据外泄都有哪些具体作用?

反截屏控制技术在防止数据外泄方面具有以下具体作用: 智能反截屏技术: 当用户启动截屏操作时,并只有非涉密内容被截屏,所有涉密窗口自动隐藏,防止涉密内容被截屏。这一技术普遍支持目前市面上的各种截屏操作&#xff0…

Apache ECharts-数据统计(详解、入门案例)

简介:Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 1、介绍 图 1.1 Apache ECharts 功能、运行环境 功能: ECharts&#xff…

微信小程序使用icon图标

原因: 微信小程序使用fontawesome库使用icon图标,网上有很多教程,按照网上说法制作,引入到微信小程序中,但是验证成功,只能使用部分图标,结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

hadoop3.0高可用分布式集群安装

hadoop高可用,依赖于zookeeper。 用于生产环境, 企业部署必须的模式. 1. 部署环境规划 1.1. 虚拟机及hadoop角色划分 主机名称 namenode datanode resourcemanager nodemanager zkfc journalnode zookeeper master slave1 slave2 1.2. 软件版本 java …

vue2升级到vue3的一些使用注意事项记录(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…