当前位置: 首页 > 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精进之…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...