小谈设计模式(16)—抽象工厂模式

小谈设计模式(16)—抽象工厂模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 抽象工厂模式
    • 结构
      • 抽象工厂(AbstractFactory)
      • 具体工厂(ConcreteFactory)
      • 抽象产品(AbstractProduct)
      • 具体产品(ConcreteProduct)
    • 适用情况
      • 1
      • 2
      • 3
    • Java程序实现
      • 首先,我们定义抽象产品接口:
      • 然后,我们定义具体产品类实现抽象产品接口:
      • 接下来,我们定义抽象工厂接口:
      • 然后,我们定义具体工厂类实现抽象工厂接口:
      • 最后,我们可以使用抽象工厂模式来创建具体产品对象:
      • 输出结果
      • 程序分析
    • 优缺点分析
      • 优点
        • 1
        • 2
        • 3
      • 缺点
        • 1
        • 2
        • 3

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象创建的方式,而无需指定它们具体的类。
在这里插入图片描述

结构

抽象工厂(AbstractFactory)

声明一组创建产品对象的方法,每个方法对应一个具体产品类的创建。

具体工厂(ConcreteFactory)

实现抽象工厂接口,负责创建具体的产品对象。

抽象产品(AbstractProduct)

声明产品的共同接口,所有具体产品类都实现这个接口。

具体产品(ConcreteProduct)

实现抽象产品接口,定义具体产品的属性和行为。
在这里插入图片描述

适用情况

1

系统需要一组相关或相互依赖的产品对象,并希望统一创建它们。

2

系统不关心具体产品的创建过程,只关心产品的接口。

3

系统需要提供一个产品的类库,而不想暴露具体实现。
在这里插入图片描述

Java程序实现

首先,我们定义抽象产品接口:

public interface Shape {void draw();
}

然后,我们定义具体产品类实现抽象产品接口:

public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}

接下来,我们定义抽象工厂接口:

public interface ShapeFactory {Shape createShape();
}

然后,我们定义具体工厂类实现抽象工厂接口:

public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}

最后,我们可以使用抽象工厂模式来创建具体产品对象:

public class Main {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();ShapeFactory rectangleFactory = new RectangleFactory();Shape circle = circleFactory.createShape();circle.draw();Shape rectangle = rectangleFactory.createShape();rectangle.draw();}
}

输出结果

Inside Circle::draw() method.
Inside Rectangle::draw() method.

程序分析

我们定义了抽象产品接口 Shape 和具体产品类 Circle 和 Rectangle。然后,我们定义了抽象工厂接口 ShapeFactory 和具体工厂类 CircleFactory 和 RectangleFactory。最后,我们使用抽象工厂模式创建了具体产品对象 Circle 和 Rectangle。
在这里插入图片描述

优缺点分析

优点

1

提供了一种方便的方式来创建一组相关的产品对象,使得客户端无需关心具体产品的创建细节,只需要通过抽象接口来使用产品。

2

客户端与具体产品类解耦,增强了系统的灵活性和可扩展性。可以方便地替换具体工厂类和产品类,而不影响客户端的代码。

3

符合开闭原则,增加新的产品族和产品等级结构时,只需要添加对应的具体工厂类和产品类,而不需要修改已有的代码。
在这里插入图片描述

缺点

1

增加了系统的复杂度和理解难度。由于抽象工厂模式涉及多个抽象接口和具体实现类,需要理解和管理的类和接口较多,增加了代码的复杂性。

2

当需要增加新的产品等级结构时,需要修改抽象工厂接口和所有具体工厂类,破坏了开闭原则。

3

当产品族中的产品种类非常多时,会导致具体工厂类的数量增加,增加了系统的维护成本。

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

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

相关文章

FPGA project : fifo_sum

实验目标: col(列) 4 ;line(行) 5。相邻三行,按列求和。输出新的数据流。 实现方法: 通过rs232通信协议,输入数据流。第一行存进fifo1,第二行存进fifo2.当输入第三行第一个数据的时候,从fif…

Verilog HDL阻塞赋值和非阻塞赋值笔记

1. module test( input wire clk, input wire b, output reg a, output reg c ); always(posedge clk) begin ab; ca; end endmodule 上面的代码在vivado中综合后的电路为: 2. module test( input wire clk, input wire b, outp…

offer突击训练营,给你一个offer的保障,求职跳槽的看过来!

大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。 目前组建的团队,专注Java技术分享&#xff0c…

互联网Java工程师面试题·Memcached篇·第一弹

目录 1、Memcached 是什么,有什么作用? 1.1 memcached 服务在企业集群架构中有哪些应用场景? 1.1.1 作为数据库的前端缓存应用 1.1.2 作业集群的 session 会话共享存储 2、Memcached 服务分布式集群如何实现? 3、Memcach…

【Blender实景合成】会跳舞的神里绫华

效果预览 本文将介绍Blender用于实景合成的工作流程。 先看效果: 神里绫华爬上了我的办公桌 模型和动作资源准备 角色模型 本次主要使用的是原神游戏中,神里绫华的角色模型,该模型米哈游在模之屋网站上进行开源。 下载地址:ht…

1500*B. Zero Array(贪心数学找规律)

Problem - 1201B - Codeforces 解析&#xff1a; 因为每次减少2&#xff0c;如果总和为奇数肯定无法实现。 特例&#xff0c;如果某个数大于其他所有数的总和&#xff0c;同样无法实现。 其他均可实现。 #include<bits/stdc.h> using namespace std; #define int long l…

六、vpp 流表+负载均衡

草稿&#xff01;&#xff01;&#xff01; vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能&#xff0c;比如这里的流表 今天我们再用VPP实现一个流表的功能 一、流表 1.1流表----plugin init VLIB_REGISTER_NODE 注册流表节点 // 注册流…

在CSV文件读取时id读取之后成了‘锘縤d‘,该怎么修改

问题描述 准备用python实现一个小想法&#xff0c;里边数据可能会有点多&#xff0c;也为了代码能成块展示&#xff0c;所以打算写一个读取文件的函数。此时考虑到python中可以直接将CSV格式文件读取成字典的形式&#xff0c;所以尝试了一下。但是中间出现了错误&#xff0c;第…

软件测试|Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化…

详解IDEA git 版本回滚

作者简介 目录 1.git分区 2.未commit&#xff0c;进行回滚 3.commit未push&#xff0c;进行回滚 3.1.undo commit 3.2.reset 4.已commit&push&#xff0c;进行回滚 1.git分区 git的版本回滚其实就是回滚不同的分区&#xff0c;所以在聊git回滚之前我们有必要简单了解…

开源即时通讯IM框架 MobileIMSDK v6.4 发布

一、更新内容简介 本次更新为次要版本更新&#xff0c;进行了若干优化&#xff08;更新历史详见&#xff1a;码云 Release Notes、Github Release Notes&#xff09;。MobileIMSDK 可能是市面上唯一同时支持 UDPTCPWebSocket 三种协议的同类开源IM框架。 二、MobileIMSDK简介…

基于风驱动优化的BP神经网络(分类应用) - 附代码

基于风驱动优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于风驱动优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.风驱动优化BP神经网络3.1 BP神经网络参数设置3.2 风驱动算法应用 4.测试结果&#x…

递归

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;汉诺塔 &#x1f449;&…

java 将字符串转为Base64格式与将Base64内容解析出来

首先要引入依赖包 import java.nio.charset.StandardCharsets; import java.util.Base64;然后对应一下两个代码 将字符串转为Base64 Base64.getEncoder().encodeToString(需要转换的字符串.getBytes(StandardCharsets.UTF_8));将 Base64 字符串解析成原来的内容 byte[] deco…

每日一题 901. 股票价格跨度(中等,单调栈)

理解题目&#xff0c;对于第 i 天&#xff0c;要求的是前 i - 1 天所满足条件的跨度 思路&#xff1a; 暴力搜索的方式是&#xff0c;对于每一个第 i 天都遍历搜索 i - 1&#xff0c; i - 2&#xff0c;…&#xff0c;直到第 j 天大于当前价格优化&#xff0c;考虑哪里进行了…

论文总结:3D Talking Face With Personalized Pose Dynamics

论文解决的问题:大多数现有的3D人脸生成方法只能生成静态头部姿势的3D面部,只有少数几篇文章关注头部姿势的生成,但这些文章也忽略了个体属性。 解决方法:框架由两个独立模块组成:PoseGAN和PGFace。给定输入音频,PoseGAN首先为3D头部生成一个头部姿势序列,然后PGFace利用…

blender光照系统设置

0&#xff09;Viewport Shading设置里面的Lighting下面的参数&#xff1a; Scene Lights,Scene World - Scene Lights是指在渲染模式下是否使用场景中的灯光对象来照亮物体。 - Scene World是指在渲染模式下是否使用场景中的世界设置来作为背景和环境光。如果关闭该选项&#…

数据库基础知识

数据库 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员? 数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。数据库管理系统 : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大…

TL-ER3220G端口映射设置

1、打开IE浏览器或其它浏览器&#xff0c;在地址栏输入192.168.1.1登录路由器的Web管理界面&#xff1b; 2、打开后弹出密码输入框&#xff0c;输入路由器的用户名和密码&#xff0c;出厂默认值为admin/admin&#xff0c;成功登录后将看到路由器的系统状态信息&#xff1b; 3、…

Python中如何获取各种目录路径

最近总是遇到各种路径问题&#xff0c;学习总结一下 文章目录 1. 获取各种目录的方法&#xff1a;2. Python测试脚本&#xff1a; 1. 获取各种目录的方法&#xff1a; 当前工作目录&#xff1a;这是你从哪里运行了你的Python脚本。 current_directory os.getcwd()脚本所在目录…