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

news2024/11/26 19:27:01

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

工厂模式 ( Factory Pattern )

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

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

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

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

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

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

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

package testDesignPatterns;

public interface Shape {
	   void draw();
	}

实现方法之一

package testDesignPatterns;

public class Circle implements Shape {

	   @Override
	   public void draw() {
	      System.out.println("画出一个圆圈");
	   }
	}

实现方法之二

package testDesignPatterns;

public class Square implements Shape {

	   @Override
	   public 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();
	   }
	}

在这里插入图片描述

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

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

相关文章

工业控制(ICS)学习笔记

目标:工业互联网安全的比赛 工控CTF之协议分析1——Modbus_ctf modbus-CSDN博客 常见的工控协议有:Modbus、MMS、IEC60870、MQTT、CoAP、COTP、IEC104、IEC61850、S7comm、OMRON等 不用看了,没太多技术含量,做了一会发现全得看答案…

【工程实践】Docker使用记录

前言 服务上线经常需要将服务搬到指定的服务器上,经常需要用到docker,记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…

Python 邮件发送(163为例)

代码 import smtplib import socket from email.mime.text import MIMEText from email.header import Headerdef send_mail():# 设置发件人、收件人、主题、内容from_address 18847097110163.comto_address 963268595qq.comsubject test emailbody hahahhahaha# SMTP邮件…

向量数据库的分类概况

保存和检索矢量数据的五种方法: 像 Pinecone 这样的纯矢量数据库 全文搜索数据库,例如 ElasticSearch 矢量库,如 Faiss、Annoy 和 Hnswlib 支持矢量的NoSQL 数据库,例如 MongoDB、Cosmos DB 和 Cassandra 支持矢量的SQL 数据库&am…

农业水土环境建模流程、DEM数据制备、土地利用数据制备、土壤数据制备、气象数据制备、农业措施数据制备、参数率定与结果验证、农业面源污染分析

目录 一、农业水土环境建模概述 二、ArcGIS入门 三、农业水土环境建模流程 四、DEM数据制备流程 五、土地利用数据制备流程 六、土壤数据制备流程 七、气象数据制备流程 八、农业措施数据制备流程 九、参数率定与结果验证 十、模型结果分析及地图制作 十一、农业土壤…

MT8788核心板主要参数介绍_联发科MTK安卓核心板智能模块

MT8788核心板是一款功能强大的4G全网通安卓智能模块,具有超高性能和低功耗特点。该模块采用联发科AIOT芯片平台。 MT8788核心板搭载了12nm制程的四个Cortex-A73和四个Cortex-A53处理器,最高主频可达2.0GHZ。它还配备了4GB64GB(2GB16GB、3GB32GB)的内存&a…

4004 DC音频转换器原理

4004是一款低噪声、固定频率360KHz的电荷泵型DC DC转换器,在输入电压2.8V到5V的情况下,恒定输出5V电压,电压精度为:3%,输出电流达到300mA。4004外部零件少,非常适合小型的电池供电应用。4004优化后的电荷泵…

2023亚太杯数学建模A题思路解析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

2023亚太杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

python 路径变更后 pip 运行报错

python 路径变更后 pip 运行报错 Fatal error in launcher: Unable to create process using "d:\python-3.6.6\python .exe" "D:\python-3........出现这种原因是因为生产 Scripts\pip.exe中存在绝对路径,因此当python变更过路径后所有 Scripts目…

YOLOv8 营业执照提取 统一社会信用代码、企业名称

目录 背景 尝试一:整图OCR识别,然后正则匹配 尝试二:利用显著特征,直接传统方法定位,切出来识别 尝试三:yolov8训练一个统一社会信用代码、企业名称位置检测 ​编辑 效果 模型信息 项目 ​编辑 代…

终端训练模型日志重定向

在终端中要执行模型的训练时,我们有时候既需要把模型执行的日志输出到终端展示,又想把训练日志保存到日志文件中: 假设执行的代码时trian.py python -u train.py | tee -a ./train.log-u:这是 Python 解释器的一个选项,用于强制标…

DRAM和SRAM

特点 Static Random Access Memory:速度快、存储一位需要元器件更多、功耗较大、集成度低、更贵 Dynamic Random Access Memory:容量大、需刷新、附属电路更复杂、功耗较小、集成度高 存储位元 SRAM DRAM 逻辑结构 SRAM 典型的SRAM芯片有6116&am…

【已解决】git push send-pack: unexpected disconnect while reading sideband packet

解决办法:修改缓存大小 打开项目所在路径下的git目录 找到config文件,用记事本打开编辑。 添加如下内容并保存即可 [http] postBuffer 1048576000

【NLP】大型语言模型,ALBERT — 用于自监督学习的 Lite BERT

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

社交媒体可持续性挑战:TikTok的危机与应对

随着社交媒体的全球普及,TikTok已成为一个备受欢迎的短视频平台,吸引了数以亿计的用户。然而,在其增长和成功背后,也伴随着一系列可持续性挑战。本文将深入探讨TikTok面临的可持续性问题,以及它如何应对这些挑战&#…

libusb获取Windows设备实例路径DevicePath

libusb 当前版本(1.0.26)libusb.h 头文件提供的接口似乎没有办法获取 Windows 平台相关的设备实例路径,其形如: \\?\usb#vid_04ca&pid_7070#5&20d34a76&0&6#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 只是提供了…

内网渗透(frp和proxychains4)

一、准备工作 需要三台机器,去哦这里准备的是win7(目标主机),kali(攻击者),红帽(跳板) 攻击机(kali):192.168.10.15 跳板机&#xff0…

生成式AI以及当前趋势

ChatGPT 激发了人们的想象力和好奇心。自 2022 年 11 月推出后,短短两个月内其月活用户便达到 1 亿,成为有史以来增长速度最快的消费类应用和第一个杀手级的生成式 AI 应用。随着创新节奏的加快,想要紧跟生成式 AI 的发展速度,难度…

SharePoint-连接Excel

Power Automate和Power Apps想要连接Excel表格的话,可以在OneDrive或SharePoint网站的文档中创建Excel文件,然后把Excel转换成table表格 以SharePoint为例,在文档中点击新建,选择Excel工作簿 填写内容,然后全选选中 在…