【设计模式】之工厂模式

工厂模式

1.介绍

工厂模式(创建型模式),是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式;

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

工厂模式是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式;虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

主要解决:主要解决接口选择的问题。(选择不同的接口,实例化不同的工厂对象)

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

应用实例:

  1. 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  2. Hibernate 换数据库只需换方言和驱动就可以。

优点:

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

缺点:

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

使用场景:

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  2. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  3. 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。

有一点需要注意的地方就是:

  • 复杂对象适合使用工厂模式;
  • 而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

2.具体步骤(实现代码)

  • 创建接口,定义方法;
  • 子类实现接口,重写方法;
  • 创建工厂,生产用户需要的实体类对象;
  • 使用工厂,获取实体类,执行该类的方法等;
步骤1:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类;创建过程在其子类执行
/*** 步骤一:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类;* 创建过程在其子类执行**/
//定义一个形状接口
public interface Shape {//定义画形状的方法void draw();
}
步骤2:定义实现接口的实体类
/*** 步骤2:定义实现接口的实体类*/
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("画圆形的子类");}
}
/*** 步骤2:定义实现接口的实体类*/
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画长方形的子类");}
}
/*** 步骤2:定义实现接口的实体类*/
public class Square implements Shape {@Overridepublic void draw() {System.out.println("画正方形的子类");}
}
步骤3:创建一个工厂,生成基于给定信息的实体类的对象。
/*** 步骤3:创建一个工厂,生成基于给定信息的实体类的对象。*/
public class ShapeFactory {//使用getShape获取形状类型的对象public Shape getShape(String shapeType) {if (shapeType == null) {return null;}//equalsIgnoreCase()不考虑大小写if (shapeType.equalsIgnoreCase("circle")) {return new Circle();} else if (shapeType.equalsIgnoreCase("square")) {return new Square();} else if (shapeType.equalsIgnoreCase("rectangle")) {return new Rectangle();}return null;}
}
步骤4:使用工厂,通过用户传递信息获取实体类的对象
public class TestMain {public static void main(String[] args) throws IOException {//用户输入BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));String str = buff.readLine();//创建工厂对象ShapeFactory shapeFactory=new ShapeFactory();//通过工厂对象获取实体类的对象Shape shape1=shapeFactory.getShape(str);//执行某个实体类的方法shape1.draw();}
}

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

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

相关文章

服务器挖矿木马识别与清理

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源,一般都会对全网进行无差别扫描,同时利用SSH爆破和漏洞利用等手段攻击主机。部分挖矿木马还具备蠕虫化的特点,在主机被成…

Threejs利用着色器编写动态飞线特效

一、导语 动态飞线特效是可视化数据地图中常见的需求之一,鼠标点击的区块作为终点,从其他区块飞线至点击区块,附带颜色变换或者结合粒子动画 二、分析 利用创建3点来构成贝塞尔曲线,形成线段利用着色器材质来按照线段以及时间…

Go语言学习:第1天

一、为什么开始学go语言 我自己是做测试的,所测试项目使用的是go语言。开始学习go语言的原因有两个:一方面,为了更好的做好工作; 另一方面,为了提高自己的核心竞争力。 二、第1天学习到的内容 2.1 Go是怎么解决包依…

JavaScript——严格检查模式

‘use strict’ &#xff1a; 严格检查模式&#xff0c;预防JavaScript的随意性导致产生的一些问题&#xff08;必须写在JavaScript的第一行&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…

buildadmin:表格中实现详情按钮

其一&#xff1a;创建组件并在当前控制器中引入组件 <!-- 示例核心代码(1/3) --> <!-- 详情组件在此处使用&#xff0c;但显示与否的判断是写在组件内的 --> <Detail /><!-- 引入组件 --> import Detail from ./detail.vue其二&#xff1a;注册按钮 …

ospf 知识总结

ospf 知识总结 一、ospf的概念 - 开放式最短路径优先协议&#xff0c;是广泛使用的一种动态路由协议&#xff0c;它属于链路状态路由协议&#xff0c;是一个内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内决策路由。 - …

DeepMind大型语言AI模型FunSearch在数学科学中取得新发现

大型语言模型 (LLM) 是有用的助手 – 它们擅长组合概念&#xff0c;并且可以阅读、编写和编码来帮助人们解决问题。但他们能发现全新的知识吗&#xff1f;由于法学硕士已被证明会“幻觉”事实上不正确的信息&#xff0c;因此利用它们来做出可验证的正确发现是一个挑战。 FunSea…

HarmonyOS:使用MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

各技术栈需要掌握的知识

一、前端工程师需要掌握的知识 前端工程师需要掌握的知识主要包括以下几个方面: HTML、CSS和JavaScript:这是前端工程师的基础知识,需要熟练掌握。HTML是网页的骨架,CSS是网页的外观和样式,JavaScript则是实现网页交互效果的关键。响应式设计:随着移动设备的普及,响应…

测试用例设计方法之判定表详解!!

理论部分 判定表是分析和表达多种输入条件下系统执行不同动作的工具&#xff0c;它可以把复杂的逻辑关系和多种 条件组合的情况表达得既具体又明确。 条件桩(Condition Stub)动作桩(Action Stub&#xff09;条件项(Condition Entry&#xff09;动作项(Action Entry&#xff0…

Linux(4)-LAMP

L-LinuxA-apache/nginxM-mysqlp-php 搭建LAMP以及使用discuz搭建论坛网站 安装apache yum install httpd -y // 安装service httpd start // 启动Apache通过netstat -tunlp查看apache运行的端口&#xff0c;然后打开虚拟机ip 80端口能看到以下页面 或者 安装Mysql centOS6…

ECAT【对象字典】

1000h&#xff1a; - wAxisStructID WORD 16#FE12 3S用于检查结构类型的内部变量。 1000 n轴状态 SMC_AXIS_STATE (INT) standstill 轴PLCopen状态机: 0: power_off1: errorstop 2: stopping 3: standstill 4: discrete_motion5: continuous_motion 6:synchronized_mo…

自然数分解 C语言xdoj64

输入说明 一个正整数 n&#xff0c;0<n<30 输出说明 输出n个连续奇数&#xff0c;数据之间用空格隔开&#xff0c;并换行 输入样例 4 输出样例 13 15 17 19 int main() {int n;scanf("%d",&n);if(n % 2 0){//n为偶数int in;//打印数字个数&#xff0c;做循…

【WINCC制作水管水流动画】

&#xff37;&#xff29;&#xff2e;&#xff23;&#xff23;简单制作水管水流动画 详情如下图所示&#xff1a; 1.首先用布化好管道&#xff0c;同时在管道内部画好折线图用以表示水流路径 2.选中折线图调整全局颜色方案 3.选择线条颜色 4.调整线条的线宽和线型 5.效果…

设计模式——组合模式(结构型)

引言 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两类对象&#xff1a; ​…

关于Linux你必须知道的五件事

Linux是一种开源操作系统 (OS)。操作系统是直接管理系统硬件和资源&#xff08;如 CPU、内存和存储&#xff09;的软件。操作系统位于应用程序和硬件之间&#xff0c;并在所有软件和执行工作的物理资源之间建立连接。 俄罗斯军方计划用 Astra Linux 取代 Windows&#xff01;为…

JavaScript值类型和引用类型两道经典面试题

JavaScript值类型和引用类型两道经典面试题 题目1题目2 题目1 首先&#xff0c;小试牛刀&#xff0c;请看第一道题。 let a {x: 10 } let b a a.x 20 console.log(b.x)a {x: 30 } console.log(b.x) a.x 40 console.log(b.x);那么上述代码输出结果是多少呢&#xff1f; …

【Spring教程30】Spring框架实战:从零开始学习SpringMVC 之 Rest风格简介与RESTful入门案例

目录 1 REST简介2 RESTful入门案例2.1 环境准备2.2 思路分析2.3 修改RESTful风格 3 知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安…

Flink-水位线和时间语义

Flink中的时间含义 在实际应用中&#xff0c;事件时间语义会更为常见。一般情况下&#xff0c;业务日志数据中都会记录数据生成的时间戳&#xff08;timestamp&#xff09;&#xff0c;它就可以作为事件时间的判断基础。 在Flink中&#xff0c;由于处理时间比较简单&#xff0c…

vue 浙里办前端改造,引入jquery脚本文件并使用

在 Vue.js 项目中引入外部 JavaScript 脚本文件可以通过以下几个步骤完成&#xff1a; 1. 在你的 Vue.js 项目中的 public/index.html 文件中&#xff0c;找到 <head> 标签&#xff0c;并在其中添加如下代码&#xff0c;引入 jQuery 脚本文件&#xff1a; <script s…