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

news2025/7/19 6:23:20

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象。可以理解为简单工程模式的升级,解决简单工厂模式的弊端。

本篇内容包括:关于 工厂方法模式、工厂方法模式 Demo。


文章目录

    • 一、关于 抽象工厂模式
        • 1、关于 抽象工厂模式
        • 2、简单工厂、工厂方法、抽象工厂模式对比
        • 3、关于 抽象工厂模式构成
        • 4、关于 抽象工厂模式的实现
        • 5、关于 抽象工厂模式的优缺点
    • 二、抽象工厂模式 Demo
        • 1、Demo 设计
        • 2、Demo 实现
        • 3、Demo 测试


一、关于 抽象工厂模式

1、关于 抽象工厂模式

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。这里的抽象角色就是产品族。

Ps:产品族是具有相同属性的同类型产品。

抽象工厂,非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品。

2、简单工厂、工厂方法、抽象工厂模式对比

  • 简单工厂模式:一个工厂生产所有产品。
  • 工厂方法模式:每个工厂生产自己负责的具体产品。
  • 抽象工厂模式**:**抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级(一个系列)的产品。

3、关于 抽象工厂模式构成

抽象工厂的构成:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。。

  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式支持多个抽象产品。

  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一关系。

4、关于 抽象工厂模式的实现

首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;

其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;

然后,提供一个抽象工厂类用于提供创建各种产品族产品的方法,在根据具体产品,实现相应的具体工厂类,实现创建对应产品的方法;

最后,客户端只需要调用具体工厂类的工厂方法可得到一个相应的具体产品对象。

5、关于 抽象工厂模式的优缺点

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 保证减少工厂类和具体产品的类添加。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 工厂和抽象产品里加代码,又要在具体的里面加代码。


二、抽象工厂模式 Demo

1、Demo 设计

我们设计一个图形工厂,其中图形有多种颜色(红色、蓝色 …),还有多种形状(矩形、圆形 …),我们利用工厂实现红色矩形 和 蓝色圆形的生产。

# 角色

Shape(抽象形状类)、Retangle(矩形类)、Circle(圆形类)

Color(抽象颜色类)、Red(红色类)、Blue(蓝色类)

ShapeFactory(抽象工厂类)、RedRetangleFactory(红色矩形工厂)、BlueCircleFactory(蓝色圆形工厂)

在这里插入图片描述

# 实现

Shape 作为形状产品族的抽象父类、Color 作为颜色产品族的抽象父类,使用 ShapeFactory 抽象工厂类分别实现颜色和形状的设计,最后由具体工厂实现类返回具体的颜色和形状实现

2、Demo 实现

# Shape 形状类

//抽象形状类
public abstract class Shape {
    public abstract void sayShape();
}

//矩形类
public class Retangle extends Shape {
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Retangle!");
    }
}

//圆形类
public class Circle extends Shape {
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Circle!");
    }
}

# Color 颜色类

//抽象颜色类
public abstract class Color {
    public abstract void sayColor();
}

//红色类
public class Red extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Red!");
    }
}

//白色类
public class Blue extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Blue!");
    }
}

# ShapeFactory 工厂类

//抽象工厂类
public abstract class ShapeFactory {

    public abstract Shape createShape();
    
    public abstract Color createColor();
}

//红色的矩
public class RedRetangleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Retangle();
    }
    
    @Overide
    public Color createColor() {
        return new Red();
    }
}

//蓝色的圆
public class BuleCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new blue();
    }
}

3、Demo 测试

public class Client {
    public static void main(String[] args) {
        Color color;
      	Shape shape;
      	// 红色矩形
      	ShapeFactory factory = new RedRetangleFactory();
				color = factory.createColor();
      	shape = factory.createShape();
    }
}

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

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

相关文章

Executors-四种创建线程的手段

1 Executors.newCachedThreadPool() 从构造方法可以看出,它创建了一个可缓存的线程池。当有新的任务提交时,有空闲线程则直接处理任务,没有空闲线程则创建新的线程处理任务,队列中不储存任务。线程池不对线程池大小做限制&#x…

ESP三相SVPWM控制器的simulink仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 SVPWM则以三相的合成矢量为出发点,其基本思想为:在数学意义上的abc轴也好,αβ轴也好,其产生的电压都应该等于dq轴合成的那个电压。那么只要让…

swiper在动态创建dom过程中的问题:数据从后端请求回来后加载到页面上,dom加载完发现swiper没用了

怎么动态创建div标签: 要轮播的数据是后端返回的,所以我们要发ajax请求接收数据; 下面演示的是已经接收回来的数据,动态创建div标签: setTimeout(()>{var list ["aaa","bbb","ccc&quo…

【Redis】从计算机组成原理开始讲解为什么会出现Redis

文章目录前置知识数据库的出现Redismemcache与redis的区别前置知识 首先需要知道的一个常识就是:数据是存放在磁盘里面的。 而磁盘有两个指标: 寻址:表示找到对应的数据所需要的时间,ms带宽:表示单位时间可以有多少个…

Python排序:冒泡排序,选择排序,插入排序,希尔排序

编程中的交换元素逻辑: # python中交换元素 有内置的三方底层逻辑 可以直接交换 a 2 b 3 a, b b, a print(a) # a为3# 其他编程需要有一个中间的变量来转换 变量设为temp a 2 b 3 temp a a b b temp print(a) # a为3 -----冒泡排序----- 相邻…

openfeign原理

openfeign原理 EnableFeignClients注解启用Feign客户端,通过Import注解导入了FeignClientsRegistrar类加载额外的Bean。FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar接口,在Spring启动过程中会调用registerBeanDefinitions方法注册BeanDe…

自动化项目倍加福WCS-PG210E使用GSD文件

1.硬件电气连接 WCS-PG210E WCS3B WCS2B Pin 颜色 Pin 颜色 24V UB 1 BN棕色 2 WH白色 0V GND 3 BU蓝色 3 BU蓝色 RS485- RS485- 4 BK黑色 1 BN棕色 RS485 RS485 2 WH白色 4 BK黑色 保留 5 GY灰色 5 GY灰色 2. 安装W…

Nginx (4):nginx动静分离

什么是动静分离不解释了,网上说的很清楚,这里只说配置 目的 02虚拟机运行一个tomcat,处理动态请求,而对静态文件的访问则交给01虚拟机。操作 下面是01虚拟机的配置文件内容: server {listen 82;listen [::]:82;#root /…

六、nacos环境隔离、服务配置拉取和多环境配置共享

文章目录一、环境隔离-namespace1.namespace理解2.创建命名空间二、Nacos-实现配置管理三、nacos-实现服务配置拉取1.非热更新2.热更新:四、实现多环境配置共享1.开发环境:2.测试环境3.结论一、环境隔离-namespace 1.namespace理解 Nacos中服务存储和数…

Element Plus 组件库相关技术:7. 组件实现的基本流程及 Icon 组件的实现

前言 本章节我们将要实现 Icon 组件,Icon 组件应该是所有组件里面最简单的一个组件了,所以我们由简入深,循序渐进进行学习。Icon 组件虽然简单,但它却包含了一个组件的全部基础流程,通过实现 Icon 组件进行理解 Eleme…

疫情失业之下,测试的未来在哪里

前天和测试圈子里一个朋友聊了关于今年求职招聘市场行情和个人认知以及发展副业的话题。 聊起了今年的求职招聘行情,他说他们公司已经裁了一波人了,估计年底还会有一波裁员。 今年的市场冷的有点吓人,在这么下去,他也会担心自己…

nacos实现负载均衡、权重

文章目录一、nacos服务分级存储模型二、Nacos-NacosRule 实现负载均衡三、nacos-服务实例的权重设置一、nacos服务分级存储模型 修改 application.yml 配置文件: spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ #集群位置&#xff0c…

Linux C/C++ 学习笔记(九):百万并发的服务器实现

本文内容参考自(2条消息) Linux C/C 开发(学习笔记十三):百万并发的服务器实现_菊头蝙蝠的博客-CSDN博客_linux百万并发 一、connection_refuesed ---->文件系统最大的进程fd个数 nat 模式,物理机的VMnet8网卡,连接到了VMnet…

selenium--关闭窗口,指定窗口大小,前进,后退,刷新等等

关闭窗口跳转到指定页面窗口大小设置返回上个页面前进到下一个页面页面刷新关闭窗口 在selenium中执行完关闭窗口一般有两种方法: driver.close() driver.quit()这两个都是常用的方法,但是他们有什么区别呢? 对于driver.close(),他是关闭当…

【FME实战教程】003:FME读取地理空间数据(矢量、栅格、点云、三维模型、数据库、地理服务)大全

FME读取地理空间数据(矢量、栅格、点云、三维模型、空间数据库、地理服务)大全。 文章目录1. FME读取数据1.1 读取矢量1.1.1 读取Shapefile1.1.2 读取dwg1.2 读取栅格数据1.2.1 影像DOM1.3 读取地理数据库1.3.1 读取文件数据库(.gdb&#xff…

机械原理复习试题

​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) ​ 编辑 添加图片注释,不超过 140 字(可选) ​ 编辑…

聚类分析的基本概念和方法

聚类分析的基本概念和方法 文章目录聚类分析的基本概念和方法前言一、什么是聚类分析1、聚类分析基本流程与步骤2、 什么是好的聚类方法3、聚类的模型评估4、聚类分析的比较5、聚类分析的挑战二、基本聚类方法概述三、划分算法1、基本概念2、k-means 聚类方法1、k-means 方法的…

CMake中configure_file的使用

CMake中的configure_file命令用于将一个文件拷贝到另一个位置并修改其内容&#xff0c;其格式如下&#xff1a; configure_file(<input> <output>[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |FILE_PERMISSIONS <permissions>...][COPYONLY] [ESCAPE_…

01 一条SQL 语句是如何执行的?

select * from teacher where id 10 1、一条简单的sql语句底层的执行过程是怎么样的&#xff1f; 答&#xff1a;一条sql执行会经过连接器、查询缓存、分析器、优化器和执行器等步骤。 2、连接器的作用是什么&#xff1f; 答&#xff1a;sql查询&#xff0c;首先连接到这个数…

【机器学习项目实战10例】(四):利用XGBoost实现短期电力负荷预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、利用XGBoost实现短期电力负荷预测二、数据集介绍三、将数据进行标准化四、形成训练数据五、划分训练集、测试集六、定义模型七、模型训练八、训练集、测试集验证九、网络搜索十、绘制结果一、利用XGBoost实现短期电力负荷…