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

设计模式之工厂模式 ( Factory Pattern )(1)

其他设计模式也会后续更新…
设计模式其实需要有一定开发经验才好理解,对代码有一定的设计要求,工作中融入才是最好的

工厂模式 ( Factory Pattern )

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式

工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

工厂模式属于创建型模式
白话解释:

您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现;
使用场景:

1、 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方;
2、 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时;
优点:

1、 一个调用者想创建一个对象,只要知道其名称就可以了;
2、 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
3、 屏蔽产品的具体实现,调用者只关心产品的接口;
缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
实例
一个接口

package testDesignPatterns;public interface Shape {void draw();}

实现方法之一

package testDesignPatterns;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画出一个圆圈");}}

实现方法之二

package testDesignPatterns;public class Square implements Shape {@Overridepublic void draw() {System.out.println("画出一个正方形");}}

创建工厂,生成基于给定信息的实体类的对象

package testDesignPatterns;public class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType == null){return null;}     if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();}  else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}}

使用该工厂,通过传递类型信息来获取实体类的对象----获取对象

package testDesignPatterns;public class TestFactoryPattern {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();//获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取 Square 的对象,并调用它的 draw 方法Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();}}

在这里插入图片描述

相关文章:

设计模式之工厂模式 ( Factory Pattern )(1)

其他设计模式也会后续更新… 设计模式其实需要有一定开发经验才好理解,对代码有一定的设计要求,工作中融入才是最好的 工厂模式 ( Factory Pattern ) 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式 工厂模式在创建对…...

OpenCV入门11:轮廓提取和形状识别

轮廓分析主要用于轮廓提取和形状识别等任务。在OpenCV中,轮廓提取和形状识别是图像处理和计算机视觉中常见的任务。下面是关于这两个知识点的一些基本内容: 轮廓提取: 轮廓提取是指从图像中提取出物体轮廓的过程。在OpenCV中,可…...

竞赛选题 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习加…...

Java编程--定时器/线程池/工厂模式/ ThreadPoolExecutor

前言 逆水行舟,不进则退!!! 目录 什么是定时器 实现一个定时器 自己实现一个定时器 什么是线程池 线程池的使用: 什么是工厂模式? 自己实现一个线程池: ThreadPoolExecutor 类…...

【python】Django——django简介、django安装、创建项目、快速上手

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ Django基础——django安装、创建django项目、django快速上手 django简介django安装1. conda创建环境pydjango2. pip安装django3. django目录 创建项目1. 打开终端(cmd)2. 进入某个目录3.创建项目命令4.django项目…...

未来之选:为什么向量数据库是您的数据管理利器

文章目录 前言什么是向量数据库?向量数据库的机制向量数据库的优点‍查询向量数据库 什么是向量Embedding?Amazon OpenSearch Service总结 前言 向量数据库擅长处理复杂的高维数据,正在彻底改变商业世界的数据检索和分析。它们执行相似性搜索…...

隧道施工工艺流程vr线上虚拟展示成为产品3D说明书

行业内都知道,汽车生产的大部分都需要冲压加工来完成,因此汽车冲压工艺是汽车制造过程中的重要环节,传统的展示方式往往局限于二维图纸和实地操作,难以充分展现工艺的细节和流程。然而,随着技术的进步,汽车…...

Nacos(含安装)

Nacos是一个开源的动态服务发现、配置和管理平台。它提供了服务发现、服务健康检查、动态配置管理、服务元数据管理等功能,支持多种服务发现和注册方式。Nacos可以帮助开发者快速构建一个具有弹性和高可用性的微服务应用程序。Nacos的全称是Named after Configurati…...

本地跑项目解决跨域问题

跨域问题: 指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对 javascript 施加的安全限制。 同源策略: 是指协议(protocol)、域名(host)、端口号&…...

聊聊logback的isDebugEnabled

序 本文主要研究一下logback的isDebugEnabled isDebugEnabled public final class Loggerimplements org.slf4j.Logger, LocationAwareLogger, LoggingEventAware, AppenderAttachable<ILoggingEvent>, Serializable {//......public boolean isDebugEnabled() {retur…...

ChatGPT+Roblox,元宇宙的AI叙事逻辑#Leveling Up

MixCopilot 嗨&#xff0c;亲爱的听众朋友们&#xff01;欢迎收听我们的播客节目&#xff01;我是你们的主播&#xff1a;MixCopilot 混合副驾。今天我们要为大家带来的是我们的AI革命系列节目之一。这个系列节目聚焦于AI领域的一些最有影响力的建设者&#xff0c;他们将会讨论…...

Spark算子

一、编写spark程序的准备工作&#xff08;程序入口 SparkContext&#xff09; 1.创建SparkConf val conf new SparkConf().setMaster("local[2]").setAppName("hello-app") 2.创建sparkContext val sc: SparkContext new SparkContext(conf) 二、基…...

Containerd接入Harbor仓库

在使用容器时&#xff0c;避免不了会使用到私有仓库&#xff0c;一般都是采用 harbor 作为私有仓库&#xff0c;docker 对接 harbor 仓库非常简单&#xff0c;哪 containerd 如何对接 harbor 呢&#xff1f; 在内网使用 harbor 根据个人习惯&#xff0c;一般都是非 http 并且是…...

Angular 组件介绍及使用(一)

Angular 概述 Angular 是一个用于构建 Web 应用程序的开源前端框架&#xff0c;由 Google 团队开发和维护。它采用 TypeScript 编程语言&#xff0c;并借鉴了一些传统的 Web 开发模式和最佳实践&#xff0c;提供了强大而灵活的工具和特性。 以下是 Angular 的一些概述要点&am…...

2023.11.13 hive数据仓库之分区表与分桶表操作,与复杂类型的运用

目录 0.hadoop hive的文档 1.一级分区表 2.一级分区表练习2 3.创建多级分区表 4.分区表操作 5.分桶表 6. 分桶表进行排序 7.分桶的原理 8.hive的复杂类型 9.array类型: 又叫数组类型,存储同类型的单数据的集合 10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合…...

Spring Cloud学习(七)【Docker 容器】

文章目录 初识 DockerDocker 介绍Docker与虚拟机Docker架构安装 Docker Docker 基本操作镜像相关命令容器相关命令数据卷 Dockerfile 自定义镜像镜像结构Dockerfile DockerComposeDockerCompose介绍安装DockerCompose Docker镜像仓库常见镜像仓库服务私有镜像仓库 初识 Docker …...

好题分享(2023.11.5——2023.11.11)

目录 前情回顾&#xff1a; 前言&#xff1a; 题目一&#xff1a;补充《移除链表元素》 题目二&#xff1a;《反转链表》 解法一&#xff1a;三指针法 解法二&#xff1a;头插法 题目三&#xff1a; 《相交链表》 题目四&#xff1a;《合并两个有序数列》 题目五&…...

第二章 03Java基础-IDEA相关叙述

文章目录 前言一、IDEA概述二、IDEA下载和安装三、IDEA项目结构介绍四、IDEA的项目和模块操作总结前言 今天我们学习Java基础,IDEA下载以及相关配置和基础使用方法 一、IDEA概述 1.IDEA全称IntelliJ IDEA,是用于Java语言开发的集成工具,是业界公认的目前用于Java程序开发最…...

第三阶段第二章——Python高阶技巧

时间过得很快&#xff0c;这么快就来到了最后一篇Python基础的学习了。话不多说直接进入这最后的学习环节吧&#xff01;&#xff01;&#xff01; 期待有一天 春风得意马蹄疾&#xff0c;一日看尽长安花 o(*&#xffe3;︶&#xffe3;*)o 1.闭包 什么是闭包&#xff1f; 答…...

【Git】Git分支与应用分支Git标签与应用标签

一&#xff0c;Git分支 1.1 理解Git分支 在 Git 中&#xff0c;分支是指一个独立的代码线&#xff0c;并且可以在这个分支上添加、修改和删除文件&#xff0c;同时作为另一个独立的代码线存在。一个仓库可以有多个分支&#xff0c;不同的分支可以独立开发不同的功能&#xff0…...

Image-to-Video优化指南:借鉴ddu官网资源,提升生成效率

Image-to-Video优化指南&#xff1a;借鉴ddu官网资源&#xff0c;提升生成效率 1. 引言&#xff1a;为什么需要优化Image-to-Video生成 将静态图片变成动态视频是很多创作者的需求&#xff0c;但实际操作中常遇到三个主要问题&#xff1a;生成速度慢、显存占用高、视频效果不…...

LM339比较器:从基础参数到典型应用场景解析

1. LM339比较器基础解析 第一次接触LM339时&#xff0c;我完全被它"四合一"的设计惊艳到了——这个比指甲盖还小的芯片里&#xff0c;竟然藏着四个独立工作的电压比较器。简单来说&#xff0c;它就像四个并排摆放的天平&#xff0c;能同时比较八路电压信号的高低。实…...

HG-ha/MTools实操手册:利用开发辅助功能提高编码效率

HG-ha/MTools实操手册&#xff1a;利用开发辅助功能提高编码效率 1. 开箱即用的全能开发助手 你是不是经常在开发过程中遇到这样的困扰&#xff1a;需要频繁切换不同工具来处理图片、编辑音视频、调试代码&#xff1f;HG-ha/MTools 可能就是你要找的解决方案。 这是一款功能…...

RMBG-2.0镜像安全加固:非root用户运行、网络隔离、资源限制配置指南

RMBG-2.2镜像安全加固&#xff1a;非root用户运行、网络隔离、资源限制配置指南 在AI应用快速部署的今天&#xff0c;我们往往更关注模型的效果和速度&#xff0c;而忽略了运行环境的安全性。想象一下&#xff0c;你精心部署了一个图像处理服务&#xff0c;结果因为一个简单的…...

OpenClaw故障诊断:Qwen3.5-9B接口超时问题排查实录

OpenClaw故障诊断&#xff1a;Qwen3.5-9B接口超时问题排查实录 1. 问题现象与初步判断 那天深夜&#xff0c;我正在调试一个自动化文档处理流程&#xff0c;OpenClaw突然开始频繁报错。控制台不断弹出"Model timeout after 30000ms"的警告&#xff0c;原本10秒内能…...

C++的std--ranges适配器视图迭代器有效性保证与悬垂引用检测

C20引入的std::ranges库彻底改变了序列操作的范式&#xff0c;其中适配器视图&#xff08;如filter、transform&#xff09;通过惰性求值实现了高效的管道式编程。这种延迟执行特性也带来了迭代器有效性风险——视图可能持有悬垂引用或失效迭代器&#xff0c;导致未定义行为。本…...

别再被JJWT新版坑了!手把手教你从0.12.x降级到0.11.2解决parseClaimsJws报错

JJWT版本降级实战&#xff1a;从0.12.x回退0.11.2解决parseClaimsJws报错指南 最近在Spring Boot项目中整合JWT时&#xff0c;不少开发者反馈升级到JJWT 0.12.x后突然遭遇parseClaimsJws方法消失的编译错误。这个看似简单的API变动背后&#xff0c;其实是JJWT团队对安全架构的重…...

分层dfs,一种介于dfs与bfs之间的算法

在算法设计的深邃丛林中&#xff0c;深度优先搜索与广度优先搜索如同两条风格迥异的小径。前者沿着一条道路走到黑&#xff0c;不撞南墙不回头&#xff0c;却往往在最优解的门口徘徊——它难以回答"最少需要几步"这样的问题&#xff0c;因为一旦深入某个分支&#xf…...

PID控制算法原理与应用详解

1. PID控制算法概述PID控制算法是工业控制领域应用最广泛的控制算法之一&#xff0c;它通过比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个环节的组合&#xff0c;实现对被控对象的精确控制。这种算法结构简单、参数物理意…...

ESP32轻量libcurl移植:HTTP/HTTPS客户端开发指南

1. 项目概述libcurl-esp32是一个专为 ESP32 平台定制的轻量化 libcurl 移植库&#xff0c;其核心目标是在 PlatformIO 构建环境下&#xff0c;为嵌入式固件开发者提供标准curl/curl.h头文件接口及对应运行时功能。该库并非完整移植上游 libcurl 的全部特性&#xff08;如 FTP、…...