当前位置: 首页 > news >正文

2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法

1.概念

工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行。

在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节。

2.案例说明和分析

2.1 定义一个创建对象的接口

public interface ICourse {void record(); //录制抽象功能
}
public class JavaCourse implements ICourse {public void record() {System.out.println("录制Java课程");}
}
public class PythonCourse implements ICourse {public void record() {System.out.println("录制Python课程");}
}/** 工厂模型 */
public interface ICourseFactory {ICourse create();
}

2.2 定义接口和实现类

public class JavaCourseFactory implements ICourseFactory {public ICourse create() {return new JavaCourse();}
}
public class PythonCourseFactory implements ICourseFactory {public ICourse create() {return new PythonCourse();}
}

2.3实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

public class FactoryMethodTest {public static void main(String[] args) {ICourseFactory factory = new PythonCourseFactory();ICourse course = factory.create();course.record();factory = new JavaCourseFactory();course = factory.create();course.record();}
}

2.4 类图

在这里插入图片描述

3.总结

使用步骤:

创建一个接口A(实现抽象接口功能名write() )和实现类AImpl(实现逻辑代码:writ(){…})。

在创建创建一个接口工厂B(实现抽象功能返回接口A对象: creatA();)和实现类BImpl(实现逻辑返回AImpl实现类对象:createA(){ return new AImpl();})。

创建一个调用类 -> B b = new BImpl(); A a = b.createA(); a.write();

代码实现:

public interface A {void write(); 
}
//业务实现逻辑
public class AImpl implements A {public void write() {//不依赖于产品类实例如何被创建、实现等细节 System.out.println("写Java作业");}
}//-------------------------------
public interface B {A createA();
}
public class BImpl implements B {public A createA() {//创建对象需要大量重复的代码return new AImpl(); //一个类通过其子类来指定创建哪个对象;}
}B b = new BImpl();
A a = b.createA();
a.write();

为什么要使用工厂方法了啊?解决什么问题。

  1. 创建对象需要大量重复的代码;
  2. 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 ;
  3. 一个类通过其子类来指定创建哪个对象;

工厂方法也有缺点

  1. 类的个数容易过多,增加复杂度
  2. 增加了系统的抽象性和理解难度

工厂设计模式-抽象工厂

1.案例说明和分析

//步骤1:创建接口和实现类
public interface ICourse {/* 录制视频 */void record();
}
public class JavaCourse implements ICourse {public void record() {System.out.println("录制Java课程");}
}
//多个....// 步骤2: 创建抽象工厂类,并创建抽象方法返回实现类对象(接口对象)
public abstract class CourseFactory {public void init(){System.out.println("初始化基础数据");}protected abstract ICourse createCourse();//(都属于同一组的产品(小米空调,小米电视,小米手机)之间有一些联系) 多个....
}//步骤3:继承抽象类工厂并实现抽象方法(创建实现类并返回)
public class JavaCourseFactory extends CourseFactory {public ICourse createCourse() {super.init();return new JavaCourse();}
}
//多个....// 步骤4:创建继承抽象类的实例对象,并调用实现类中的业务逻辑方法
public class AbstractFactoryTest {public static void main(String[] args) {//一起使用创建对象需要大量重复的代码,这里就解决了。CourseFactory factory = new JavaCourseFactory();factory.createCourse().record();//多个...}
}

2.类图

在这里插入图片描述

3.总结

3.1 创建步骤:

  • 步骤1:创建接口和实现类
  • 步骤2: 创建抽象工厂类,并创建抽象方法返回实现类对象(接口对象)
  • 步骤3:继承抽象类工厂并实现抽象方法(创建实现类并返回)
  • 步骤4:创建继承抽象类的实例对象,并调用实现类中的业务逻辑方法

3.2 使用理解

强调的是系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。

同一产品结构下还有格力热水器,格力空调,格力洗衣机。

在这里插入图片描述

在这里插入图片描述

3.3使用场景

如需要创建小米品牌一组家电(电视,空调,电饭锅等等)的对象,一个一个创建代码过多而且创建过程过程复杂,这时可以用抽象工厂方法封装一起来,调用就会变得简单。

如果创建多种品牌家电,每种品牌等级和价格不同,这时候就使用抽象工厂方法封装,传入什么参数调用什么等级家电产品,返回一组家电对象

参考:
https://refactoringguru.cn/design-patterns/factory-method
https://www.yuque.com/huangjinshidai-1wt9t/ocmvo8/zr4ypvhosvzzmh24?singleDoc#

相关文章:

2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法 1.概念 工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。 在工厂方法模式中用户只需要关心所需产品对应的工厂,…...

k8s之pod进阶

1.k8s的pod重启策略 Always :不论正常退出还是非正常退出都重启deployment的yaml文件只能是always pod的yaml三种模式都可以。 OnFailure:只有状态码非0才会重启,正常退出不重启 Never:正常退出和非正常退出都不重启 容器的退…...

RTTI(运行时类型识别)

RTTI(运行时类型识别) 实验介绍 RTTI 全称 Run Time Type Identification,中文称为 “运行时类型识别”,在程序中使用 typeid 和 dynamic_cast 实现。RTTI 技术允许程序在运行时识别对象的类型。 知识点 typeiddynamic_castRTTI 技术typeid typeid 是 C++ 关键字,用于…...

19.Linux Shell任务控制

文章目录 Linux Shell任务控制1)信号通过键盘生成信号trap 命令捕获信号 2)在后台运行脚本命令后加 & 符使用nohub命令 3)作业控制4)调度优先级nice命令renice 命令 5)定时运行作业at定期执行命令reference 欢迎访问个人网络日志🌹🌹知行空间&#x…...

域名流量被劫持怎么办?如何避免域名流量劫持?

随着互联网不断发展,流量成为线上世界的巨大财富。然而一种叫做域名流量劫持的网络攻击,将会在不经授权的情况下控制或重定向一个域名的DNS记录,导致用户在访问一个网站时,被引导到另一个不相关的网站,从而劫持走原网站…...

java案例知识点

一.会话技术 概念 技术 二.跨域 三.过滤器 四.拦截器...

Arrays 的使用

Arrays 概述 提供了数组操作的相关方法&#xff0c;连接数组和集合 asList 返回指定数组的列表列表和数组的引用位置相同 Integer[] arrs new Integer[] {1,2,3,4,5,6,7,8,9};List<Integer> list Arrays.asList(arrs);System.out.println(list);arrs[5] 100;Syste…...

IDEA中怎么用Postman?这款插件你试试

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…...

基于机器视觉的车牌检测-边缘检测因子的选择

车牌检测概述 车牌识别在检测报警、汽车出入登记、交通违法违章以及移动电子警察方面应用广泛。车牌识别过程为&#xff1a;首先通过摄像头获取包含车牌的彩色图像&#xff1b;然后进行车牌边缘检测&#xff0c;先粗略定位到车牌位置&#xff0c;再精细定位&#xff1b;最后根…...

学习c语言,变种水仙花

利用函数次方pow...

K8S--持久卷(PersistentVolume)的用法

原文网址&#xff1a;K8S--持久卷(PersistentVolume)的用法-CSDN博客 简介 本文介绍K8S的持久卷(PersistentVolume)的用法。 目标&#xff1a;用持久卷的方式将主机的磁盘与容器磁盘映射&#xff0c;安装nginx并运行。 --------------------------------------------------…...

书生·浦语大模型趣味 Demo笔记及作业

文章目录 笔记作业基础作业&#xff1a;进阶作业&#xff1a; 笔记 书生浦语大模型InternLM-Chat-7B 智能对话 Demo&#xff1a;https://blog.csdn.net/m0_49289284/article/details/135412067书生浦语大模型Lagent 智能体工具调用 Demo&#xff1a;https://blog.csdn.net/m0_…...

2024最新前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 粒子文字动画特效 基于canvas实现的粒子文字动画特效 会来回切换设定的文字特效 图…...

Microsoft 365 for Mac激活版(原Office 365)

Microsoft 365 for Mac原office 365&#xff0c;包含Word、Excel、PowerPoint 和 Outlook应用程序&#xff0c;协作办公的最佳首选。 软件下载&#xff1a;Microsoft 365 for Mac激活版下载 Microsoft 365 的一些主要功能包括&#xff1a; office 应用程序&#xff1a;Microsof…...

快乐学Python,Python基础之组织代码「类与对象」

在上一篇文章中&#xff0c;我们了解了函数。这一篇文章我们来了解一下Python中另外一个重要的概念&#xff1a;类与对象。 1、类与对象 &#xff08;1&#xff09;类与对象有什么关系&#xff1f; 你可能会奇怪&#xff0c;为什么要叫类与对象呢&#xff1f;是两个不同的东…...

H5的3D游戏开源框架

在H5的3D游戏框架中&#xff0c;Three.js、Babylon.js和Turbulenz是比较受欢迎的选择。 Three.js是一个广泛应用并且功能强大的JavaScript 3D库&#xff0c;可以创建简单的3D动画到创建交互的3D游戏。 Babylon.js是David Catuhe对3D游戏引擎热爱的结果&#xff0c;是最好的Ja…...

浅谈一些生命周期

vue2生命周期 beforeCreate &#xff1a;实例创建之初 created&#xff1a;组件已经创建完成 beforeMount&#xff1a;组件挂载之前 mounted:组件挂载之后 beforeUpdate&#xff1a;数据发生变化 更新之前 undated&#xff1a;数据发生之后 beforeDestroy &#xff1a;实…...

JavaScript基础(25)_dom查询练习(二)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>dom查询练习二</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>form {margi…...

【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 生命周期 1.1. 认识生命周期 很多的事物都有从创建到销毁的整个过程&#xff0c;这个过程称之为是生命周期&…...

一文初步了解slam技术

本文初步介绍slam技术&#xff0c;主要是slam技术的概述&#xff0c;涉及技术原理、应用场景、分类、以及各自优缺点&#xff0c;和slam技术的未来展望。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;slam精进之…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...