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

01-工厂模式 ( Factory Pattern )

工厂模式 Factory Pattern

    • 摘要
    • 实现
    • 范例

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式
工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象
工厂模式属于创建型模式

摘要

1. 意图

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

2. 主要解决

主要解决接口选择的问题

3. 何时使用

我们明确地计划不同条件下创建不同实例时

4. 如何解决

让其子类实现工厂接口,返回的也是一个抽象的产品

5. 关键代码

创建过程在其子类执行

6. 应用实例

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

7. 优点

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

8. 缺点

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加
  • 在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,这并不是什么好事

9. 使用场景

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

10. 注意事项

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

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

实现

在这里插入图片描述

  1. 创建一个Shape接口和实现Shape接口的实体类;
  2. 下一步是定义工厂类ShapeFactory;
  3. FactoryPatternDemo使用ShapeFactory来获取Shape对象;

范例

1. 创建一个接口

Shape.java

package com.demo.gof;
public interface Shape {void draw();
}

2. 创建实现接口的实体类

Rectangle.java

package com.demo.gof;
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}

Square.java

package com.demo.gof;
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}

Circle.java

package com.demo.gof;
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}

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

ShapeFactory.java

package com.demo.gof;
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("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}
}

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

FactoryPatternDemo.java

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

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/FactoryPatternDemo.java
$ java  com.demo.gof.FactoryPatternDemo
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

相关文章:

01-工厂模式 ( Factory Pattern )

工厂模式 Factory Pattern 摘要实现范例 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式 工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 工厂模式属于创建型模式 摘要 1. 意图 …...

【LeetCode】每日一题 2024_2_2 石子游戏 VI(排序、贪心)

文章目录 LeetCode?启动!!!题目:石子游戏 VI题目描述代码与解题思路 LeetCode?启动!!! 题目:石子游戏 VI 题目链接:1686. 石子游戏 VI 题目描述…...

一站式在线协作开源办公软件ONLYOFFICE,协作更安全更便捷

1、ONLYOFFICE是什么? ONLYOFFICE是一款功能强大的在线协作办公软件,可以创建编辑Word文档、Excel电子表格,PowerPoint(PPT)演示文稿、Forms表单等多种文件。ONLYOFFICE支持多个平台,无论使用的是 Windows、…...

Java进击框架:Spring-综合(十)

Java进击框架:Spring-综合(十) 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…...

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议(ICSIP 2024)将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次,在过去的七年中吸引了1200多名与会者,是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…...

webassembly003 MINISIT mnist/convert-h5-to-ggml.py

数据结构 # Convert MNIS h5 transformer model to ggml format # # Load the (state_dict) saved model using PyTorch # Iterate over all variables and write them to a binary file. # # For each variable, write the following: # - Number of dimensions (int) # …...

fetch和axios的区别

概念不同 Fetch是一种新的获取资源的接口方式,可以直接使用Axios是一个基于XMLHttpRequest封装的工具包,需要引入才可以使用 传递数据的方式不同 Fetch则是需要放在body属性中,以字符串的方式进行传递Axios是放到data属性里,以对象…...

【unity小技巧】FPS简单的射击换挡瞄准动画控制

文章目录 射击动画控制换弹动画瞄准动画完结 射击动画控制 换弹动画 调用 瞄准动画 问题:瞄准时,但是动画会卡住,不会播放瞄准的待机动画 修改 调用 动画如果太快可以去修改播放速度 播放速度变慢了,可能导致切换待机动画也…...

如何获取时间戳

在JavaScript中,你可以使用Date对象来获取时间戳。以下是一个例子: javascriptvar timestamp new Date().getTime(); console.log(timestamp); 在这个例子中,new Date()创建了一个新的日期对象,.getTime()方法则返回自1970年1月…...

VSCode 设置代理

Open Visual Studio Code, click the settings icon in the lower left corner, and click Settings....

保姆级教程: 零门槛制作AI微信红包封面之入门篇

写在前面 本文旨在低门槛制作微信红包教程,人人均可上手! 操作步骤 AI红包制作平台: https://cover.fdfs.site 第一步: 先登录 alt text 可以使用谷歌,github直接登录,也可以用自己的邮箱注册 第二步: 设置自己的apiKey API-Key可以从平台 ht…...

Redis核心技术与实战【学习笔记】 - 17.Redis 缓存异常:缓存雪崩、击穿、穿透

概述 Redis 的缓存异常问题,除了数据不一致问题外,还会面临其他三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。这三个问题,一旦发生,会导致大量的请求积压到数据库。若并发量很大,就会导致数据库宕机或故…...

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…...

App ICP备案获取iOS和Android的公钥和证书指纹

依照《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;向iOS和安卓平台提交App时需要先提交ICP备案信息。 iOS平台&#xff1a; 1、下载appuploader工具&#xff1a;Appuploader home -- A tool improve ios develop efficiency such as submit ipa to…...

猿创征文 | 项目整合KafkaStream实现文章热度实时计算

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…...

状态压缩 笔记

棋盘式的f[i][j]中表示状态的j可以是状态本身也可以是在合法状态state中的下标 用状态本身比较方便&#xff0c;用下标比较省空间 用下标的话可以开id[M]数组记录一下 蒙德里安的梦想 求把 NM的棋盘分割成若干个 12的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0…...

Java 数据结构篇-实现二叉搜索树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 二叉搜索树的概述 2.0 二叉搜索树的成员变量及其构造方法 3.0 实现二叉树的核心接口 3.1 实现二叉搜索树 - 获取值 get(int key) 3.2 实现二叉搜索树 - 获取最小…...

go语言(二十一)---- channel的关闭

channel不像文件一样需要经常去关闭&#xff0c;只有当你确实没有任何发送数据了&#xff0c;或者你想显示的结束range循环之类的&#xff0c;才去关闭channel。关闭channel后&#xff0c;无法向channel再发送数据&#xff0c;&#xff08;引发pannic错误后&#xff0c;导致接收…...

【PyQt】01-PyQt下载

文章目录 前言静态库 一、PyQt是什么&#xff1f;二、安装1.Windows环境下安装安装PyQt5Designer 2.Liunx环境下安装 总结 前言 拜吾师 PyQt5 快速入门 静态库 补充一点知识&#xff1a; Windows&#xff1a; .lib Linux: .a .so(动态库) 简单描述PyQt就是python调用C的Qt文…...

不一样的味觉体验:精酿啤酒与烤肉的绝妙搭配

在繁华的都市生活中&#xff0c;人们总是在寻找那份与众不同的味觉享受。当夏日的微风轻轻拂过&#xff0c;你是否想过&#xff0c;与三五好友围坐在一起&#xff0c;拿着Fendi Club啤酒与烤肉的绝妙搭配&#xff0c;畅谈生活点滴&#xff0c;感受那份惬意与自在&#xff1f; F…...

告别手动画框!OrCAD Capture 快速创建复合封装(附电源/地引脚处理技巧)

高效创建OrCAD复合封装的进阶技巧与避坑指南 在PCB设计流程中&#xff0c;原理图封装的创建往往是项目前期最耗时的环节之一。尤其是面对多通道运放、复杂电源管理芯片或模块化器件时&#xff0c;传统的手动绘制方式不仅效率低下&#xff0c;还容易因引脚属性设置不当导致后续D…...

如何快速上手uesave-rs:虚幻引擎存档编辑的终极指南

如何快速上手uesave-rs&#xff1a;虚幻引擎存档编辑的终极指南 【免费下载链接】uesave 项目地址: https://gitcode.com/gh_mirrors/ue/uesave 还在为无法修改心爱游戏的存档而烦恼吗&#xff1f;想要自定义游戏体验却不知从何下手&#xff1f;uesave-rs这款强大的Rus…...

大致说一下spring bean的生命周期

面试 1、实例化 Bean 2、给 Bean 属性赋值 3、初始化 Bean 4、使用 Bean 5、销毁 Bean package com.example.demo.bean;import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.beans.factory.annotation.Value; import …...

专访越擎科技创始人: 外骨骼的设计与仿真该如何入门

具身智能机器人领域的技术创新如火如荼&#xff0c;从轮式机器人&#xff0c;人形机器人&#xff0c;四足机器狗等不一而足。而从分类来看&#xff0c;外骨骼机器人作为增强人的能力的典型应用&#xff0c;不仅在医疗领域发挥重要作用&#xff0c;在工业应用等场景中也大大的增…...

从晶体管到CPU:CMOS反相器延迟如何决定你的电脑主频

从晶体管到CPU&#xff1a;CMOS反相器延迟如何决定你的电脑主频 当你按下电脑电源键的瞬间&#xff0c;数十亿个晶体管在芯片上开始协同工作。这些微观开关的切换速度&#xff0c;直接决定了处理器主频的上限。而构成所有数字电路基础的CMOS反相器&#xff0c;其动态响应特性就…...

告别混乱!用CANoe的arxml数据库高效管理车载网络信号(附Signal/PDU/Frame创建全流程)

告别混乱&#xff01;用CANoe的arxml数据库高效管理车载网络信号&#xff08;附Signal/PDU/Frame创建全流程&#xff09; 当车载网络从简单的CAN总线发展到包含FlexRay、以太网等多协议混合架构时&#xff0c;工程师们面临的信号管理复杂度呈指数级增长。一个典型的域控制器项目…...

嵌入式C语言变量初始化技术详解

## 1. 嵌入式C语言变量初始化技术详解### 1.1 初始化的重要性与基本原则在嵌入式系统开发中&#xff0c;变量初始化是防止未定义行为的关键步骤。由于嵌入式编译器特性的差异&#xff0c;未初始化的变量可能包含随机值&#xff0c;导致系统出现不可预测的行为。根据变量类型的不…...

工业数智化转型路径:JBoltAI 工具与定制化服务实践

当前&#xff0c;我国工业数智化已进入高质量发展、规模化推广的新阶段&#xff0c;成为推动制造业转型升级、构建先进工业体系的核心动力。结合行业发展现状与企业实际需求&#xff0c;JBoltAI推出针对性数智化工具及定制服务&#xff0c;为工业企业转型提供实用支撑。一、工业…...

nli-distilroberta-base在工业质检文档中的应用:SOP操作步骤与现场记录逻辑一致性核查

nli-distilroberta-base在工业质检文档中的应用&#xff1a;SOP操作步骤与现场记录逻辑一致性核查 1. 项目背景与价值 在工业制造领域&#xff0c;标准作业程序(SOP)与现场操作记录的一致性核查是质量管理的核心环节。传统人工核查方式存在效率低、主观性强、覆盖不全等问题。…...

学术PDF处理神器:OpenClaw+GLM-4.7-Flash自动提取关键结论

学术PDF处理神器&#xff1a;OpenClawGLM-4.7-Flash自动提取关键结论 1. 为什么需要自动化文献处理&#xff1f; 作为一名经常需要阅读大量学术文献的研究者&#xff0c;我发现自己花费在整理文献上的时间甚至超过了实际阅读时间。每次下载几十篇PDF后&#xff0c;手动提取目…...