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

面试题:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别

刚刚接触设计模式的时候,我相信单例模式和工厂模式应该是用的最多的,毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后,就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了,用了设计模式给我的感受就是感觉代码没那么冗余了,再注入一点贫血,充血模型之后,感觉在 service 层面代码看上去很舒服很简洁。

首先,我个人感觉策略模式和我们常说的微服务我觉得思想上很像,尤其记得当时介绍DDD时候的举例说的是关于银行的转账案例,用的事务和领域驱动设计做的比较,让人一目了然的逻辑,代码也再也没有那么冗余了。(具体的文章地址找不到了,不过网上现在比较多的介绍DDD的,大体意思是一样的)

其实工厂模式和设计模式一直给人一种错觉,总感觉是一样的,没有丝毫的区别。可以看下两种模式的UML图。

在这里插入图片描述
从图上来看,并没有多大的区别,话不多说,从具体的代码入手。

先写一个人的接口类,有eat,run,wear 3个方法

public interface People {public void eat();public void run();public void wear();
}

分别写两个实现类,一个是小明的实现类,一个是小红的实现类

public class Xiaoming implements People{@Overridepublic void eat() {System.out.println("小明吃饭");}@Overridepublic void run() {System.out.println("小明跑步");}@Overridepublic void wear() {System.out.println("小明穿衣");}
}public class Xiaohong implements People{@Overridepublic void eat() {System.out.println("小红吃饭");}@Overridepublic void run() {System.out.println("小红跑步");}@Overridepublic void wear() {System.out.println("小红穿衣");}
}

简单工厂模式的代码

public class PeopleFactory {public People getPeople(String name){if(name.equals("Xiaoming")){return new Xiaoming();}else if(name.equals("Xiaohong")){return new Xiaohong();}return null;}
}

再来看下策略模式的代码

public class StrategySign {private People people;public StrategySign(People people){this.people = people;}public StrategySign(String name){if(name.equals("Xiaoming")){this.people = new Xiaoming();}else if(name.equals("Xiaohong")){this.people = new Xiaohong();}}public void run(){people.run();}
}

策略模式的两种构造方法都可以用,我多写了一种是为了让大家看到和工厂模式的区别和联系

然后我们通过测试类运行两种模式

@Test
public void testSign(){PeopleFactory peopleFactory = new PeopleFactory();People people = peopleFactory.getPeople("Xiaohong");System.out.print("工厂模式-------------"); people.run();StrategySign strategySign = new StrategySign("Xiaohong");System.out.print("策略模式-------------");strategySign.run();
}

在这里插入图片描述
可以看到,两种设计模式的运行结果是一模一样的,那么区别到底在哪呢。

从工厂模式的代码中可以看到 工厂模式主要是返回的接口实现类的实例化对象,最后返回的结果是接口实现类中的方法,而策略模式是在实例化策略模式的时候已经创建好了,我们可以再策略模式中随意的拼接重写方法,而工厂模式是不管方法的拼接这些的,他只关注最后的结果,不注重过程,而策略模式注重的是过程。

用一个具体的例子可以看下,如果我想小红先吃饭再跑步再吃饭的话,那么我需要在测试类中写3种,而我只需要在策略模式的方法中直接定义即可。

可以看以下代码:

public class StrategySign {private People people;public StrategySign(People people){this.people = people;}public StrategySign(String name){if(name.equals("Xiaoming")){this.people = new Xiaoming();}else if(name.equals("Xiaohong")){this.people = new Xiaohong();}}public void run() {people.eat();people.run();people.eat();}
}@Testpublic void testSign(){PeopleFactory peopleFactory = new PeopleFactory();People people = peopleFactory.getPeople("Xiaohong");System.out.print("工厂模式-------------"); people.eat();System.out.print("工厂模式-------------"); people.run();System.out.print("工厂模式-------------"); people.eat();StrategySign strategySign = new StrategySign("Xiaohong");System.out.print("策略模式-------------");strategySign.run();}

在这里插入图片描述
有人可能会说如果我在实现类中直接拼接好这些方法不是就好了么?可是那样的话我们每变更一次逻辑就要新增一个方法,一次两次还好,但是当逻辑多了以后,这些代码会变得很冗余,难以维护。而且从目前情况来看,工厂模式可以做到的事情,策略模式都可以做到。策略模式可以做到的事情,工厂模式也可以做到,只是会变得麻烦。

从上述的描述来看,策略模式就和我们常说的微服务很像,比如我们写的3个接口,吃饭是一个微服务,跑步是一个微服务,穿衣是一个微服务。策略模式的宗旨就是将各项方法之间连接起来,达到一个新的方法,微服务的宗旨也是防止服务的多次调用,降低代码的耦合度,因此这么看来策略模式和微服务还是比较相像的。

相关文章:

面试题:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别

刚刚接触设计模式的时候,我相信单例模式和工厂模式应该是用的最多的,毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后,就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了…...

Windows + Git + TortoiseGit + Github

一、下载Git(Git For Windows) 1.1. Git下载地址:https://gitforwindows.org/ 1.2. 默认安装即可(包名:Git-2.42.0.2-64-bit.exe) 二、下载TortoiseGit 2.1.TortoiseGit下载地址:http://tortoi…...

MySQL数据库索引练习

1.学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Scor…...

mysql面试题10:MySQL中有哪几种锁?表级锁、行级锁、页面锁区别和联系?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Mysql中有哪几种锁? 在MySQL中,主要有以下几种类型的锁: 共享锁(Shared Lock):也称为读锁。多个事务可以同时持有共享锁,可以读取但不能修…...

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行,有四个按钮,分别对应四份php文件,开始搞一下。一开始,先要试探出 文件上传到哪里? 怎么读取上传的文件? 第一步:试探上传文件位置 直接用burp抓包,…...

javaWeb学生信息管理

一、引言 学生信息管理系统是基于Java Web技术开发的一个全栈应用,用于管理学生的基本信息。本系统采用Eclipse作为开发工具,Navicat用于MySQL数据库管理,运行在JDK1.8、Tomcat9.0、MySQL8.0环境下。前端采用JavaScript、jQuery、Bootstrap4…...

玩转gpgpu-sim 04记—— __cudaRegisterBinary() of gpgpu-sim 到底做了什么

官方文档&#xff1a; GPGPU-Sim 3.x Manual __cudaRegisterBinary(void*) 被执行到的代码逻辑如下&#xff1a; void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin ) { #if (CUDART_VERSION < 2010)printf("GPGPU-Sim PTX: ERROR ** this version of GPGPU…...

S-Clustr(影子集群)僵尸网络@Мартин.

公告 项目地址:https://github.com/MartinxMax/S-Clustr/tree/V1.0.0 1.成功扩展3类嵌入式设备,组建庞大的"僵尸网络" |——C51[开发中] |——Arduino |——合宙AIR780e[开发中] 2.攻击者端与服务端之间通讯过程全程加密,防溯源分析 3.Generate一键自动生成Arduino…...

认识PostgreSQL

深入认识PostgreSQL&#xff1a;开源世界的强大数据库 在当今数字化时代&#xff0c;数据是组织的最宝贵资源之一。数据库管理系统&#xff08;DBMS&#xff09;扮演着关键角色&#xff0c;帮助企业存储、管理和分析数据。PostgreSQL&#xff0c;作为一款开源的高级关系型数据库…...

基本的五大排序算法

目录&#xff1a; 一&#xff0c;直接插入算法 二&#xff0c;希尔排序算法 三&#xff0c;选择排序 四&#xff0c;堆排序 五&#xff0c;冒泡排序算法 简介&#xff1a; 排序算法目前是我们最常用的算法之一&#xff0c;据研究表明&#xff0c;目前排序占用计算机CPU的时…...

封装api的理解

1.基地址(baseUrl) (1).测试环境 用于测试环境的运行 (2).正式环境 用于正式环境的运行 2.拦截器 1.请求拦截器 (1)成功的回调 做的事情:例如在请求头header里面加入toekn。 (2)失败的回调 直接返回失败的结果: return promise.reject(error) 2.响应拦截器 (1)成功的回…...

Unity实现设计模式——命令模式

Unity实现设计模式——命令模式 推荐一个Unity学习设计模式很好的GitHub地址&#xff1a;https://github.com/QianMo/Unity-Design-Pattern 有非常多的Star 一、介绍 命令模式使得请求的发送者与请求的执行者之间消除耦合&#xff0c;让对象之间的调用关系更加灵活。在命令模…...

四、YApi的安装和配置

YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口...

JAVA学习(2)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

MySQL学习笔记27

MySQL主从复制的核心思路&#xff1a; 1、slave必须安装相同版本的mysql数据库软件。 2、master端必须开启二进制日志&#xff0c;slave端必须开启relay log 日志。 3、master主服务器和slave从服务器的server-id号不能一致。 4、slave端配置向master端来同步数据。 master…...

数据结构与算法之字典: Leetcode 76. 最小覆盖子串 (Typescript版)

最小覆盖子串 https://leetcode.cn/problems/minimum-window-substring/description/ 描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。注意&#xff1a; 对于 t 中重…...

2023-10-03 VsCode诡异消失事件

VsCode诡异消失事件 前言一、排查问题二、原因分析三、其它可能不好的倾向总结 前言 今天打开电脑, 习惯性的打开VsCode, 收到错误消息, 该快捷方式所指向的项目Code.exe已经更改或移动, 因此该快捷方式无法正常工作. 是否删除该快捷方式. 一、排查问题 打开快捷方式指向的位…...

elementPlus表格组件el-table实现只能同时选择一行,全选按第一行处理

目录 需求背景&#xff1a; 具体实现&#xff1a; 模板代码&#xff1a; 函数处理代码&#xff1a; 代码讲解&#xff1a; 需求背景&#xff1a; 点击表格最左侧的复选框列&#xff0c;选中当前表格行&#xff0c;而且只允许选择一行&#xff0c;选中一行后&#xff0c;其…...

栈的应用场景(三)

最小栈 1.题目2.画图分析3.代码实现 1.题目 2.画图分析 3.代码实现 package Stack;import java.util.Stack; public class MinStack {private Stack <Integer> stack;private Stack <Integer> MinStack;public MinStack() {stack new Stack<>();MinStack …...

leetCode 45.跳跃游戏 II 贪心算法

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 &…...

【MATLAB-基于直方图优化的图像去雾技术】

【MATLAB-基于直方图优化的图像去雾技术】 1 直方图均衡2 程序实现3 局部直方图处理 1 直方图均衡 直方图是图像的一种统计表达形式。对于一幅灰度图像来说&#xff0c;其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言&#xff0c;图像的视觉效果和其直方…...

读书笔记|《数据压缩入门》—— 柯尔特·麦克安利斯 亚历克斯·海奇

前言&#xff1a;在接触文本隐写研究领域时了解到这本书。本书可算作《数据压缩》的入门书籍之一&#xff0c;这本书对熵编码、变长编码、统计编码、自适应统计编码、字典编码、上下文编码等常用编码方式的定义及来源进行介绍&#xff0c;对不同场景下不同格式的压缩数据有针对…...

Pandas进阶修炼120题-第五期(一些补充,101-120题)

目录 往期内容&#xff1a;第一期&#xff1a;Pandas基础&#xff08;1-20题&#xff09;第二期&#xff1a;Pandas数据处理&#xff08;21-50题&#xff09;第三期&#xff1a;Pandas金融数据处理&#xff08;51-80题&#xff09;第四期&#xff1a;当Pandas遇上NumPy&#xf…...

NPDP产品经理知识(产品创新管理)

复习文化&#xff0c;团队与领导力 产品创新管理&#xff1a; 如何树立愿景&#xff1a; 如何实现产品战略 计划 实施产品开发&#xff1a; 商业化&#xff0c;营销计划&#xff0c;推广活动 管理产品生命周期&#xff1a; 新式走向市场的流程&#xff1a;...

Flutter+SpringBoot实现ChatGPT流实输出

FlutterSpringBoot实现ChatGPT流式输出、上下文了连续对话 最终实现Flutter的流式输出上下文连续对话。 这里就是提供一个简单版的工具类和使用案例&#xff0c;此处页面仅参考。 服务端 这里直接封装提供工具类&#xff0c;修改自己的apiKey即可使用&#xff0c;支持连续…...

淘宝天猫粉丝福利购店铺优惠券去哪里找到领取网站?

淘宝天猫优惠券去哪里找到领取网站&#xff1f; 领取淘宝天猫粉丝福利购优惠券可通过百度搜索&#xff1a;草柴&#xff0c;进入草柴官方网站 或 手机应用商店搜索&#xff1a;草柴&#xff0c;下载安装草柴APP&#xff0c;就可以领取淘宝天猫优惠券&#xff1b; 草柴APP如何领…...

【考研复习】union有关的输出问题

文章目录 遇到的问题正确解答拓展参考文章 遇到的问题 首次遇到下面的代码时&#xff0c;感觉应该输出65,323。深入理解union的存储之后发现正确答案是&#xff1a;67,323. union {char c;int i; } u; int main(){u.c A;u.i 0x143;printf("%d,%d\n", u.c, u.i); …...

Android学习之路(16) Android 数据库Litepal

一.LitePal的介绍 Litepal是Android郭霖大神的一个开源Android数据库的开源框架&#xff0c;它采用了对象关系映射&#xff08;ORM&#xff09;的模式&#xff0c;这是让我们非常好的理解的数据库&#xff0c;一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法&a…...

Redis持久化(RDB/AOF)

"在哪里走散&#xff0c;你都会 找 到 我。" 认识持久化 我们在接触Mysql事务的时候&#xff0c;一定了解过Mysql事务的四个特性: "原子性(A)一致性(C)隔离性(I)持久性(D)" 而其中持久性其实与持久化是一回事&#xff0c;所谓持久与不持久&#x…...

小谈设计模式(15)—观察者模式

小谈设计模式&#xff08;15&#xff09;—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject&#xff08;被观察者&#xff09;ConcreteSubject&#xff08;具体被观察者&#xff09;Observer&#xff08;观察者&#xff09;ConcreteObserver&#xff0…...

做化妆品网站怎样/业务网站制作

大家好&#xff0c;我是为人造的智能操碎了心的智能禅师。全文大约1900字。读完可能需要下面这首歌的时间...

房地产网站建设的目的/站长综合查询工具

本文记录一下关于延迟触发器链与它的常用用法&#xff08;即边沿检测。多级延迟的触发器应该是比较常用的&#xff0c;当我们需要对信号信号进行延时&#xff0c;这个时候我们就用到了延迟触发器链。下面就来记录一下吧。 一、多级延迟触发器&#xff08;或延迟触发器链&#x…...

中企动力做的网站后台如何登陆/推广普通话手抄报内容

Vue-Router 原理实现1.1Vue-Router 使用步骤1.2动态路由1.3嵌套路由1.4编程式导航1.5Hash 和 History 模式区别History 模式History 模式 - Node.jsHistory 模式 - nginx1.6Vue Router 实现原理Vue Router 模拟实现 ( History模式 )Vue Router - ConstructorVue Router - insta…...

wordpress可视化菜单/黄页推广

一、选择题(本题为单项选择题&#xff0c;每题1分&#xff0c;多选&#xff0c;不选或错选均不得分&#xff0c;)&#xff1a;(25分)1、世界上第一台电子数字计算机是(B)年出现的。A、1958B、1946C、1965D、19472、微型计算机的发展史可以看作是(A )的发展历史。A、微处理器B、…...

深圳网站建设怎样容易/网络营销软文范例500字

这次需要记录一下我搭建web服务器的过程。 第一步&#xff0c;确定自己要使用的平台&#xff1a;这次我用的是windows2008 server版本 第二步&#xff0c;计划是想要纯手工的安装apache、php等。但是我们可以下载一个wamp集成版&#xff08;即windows系统下apache、mysql 、php…...

南通网站上百度首页/五年级下册数学优化设计答案

1.1 数据库系统概述 基本概念&#xff1a; 数据&#xff08;Data&#xff09; 信息&#xff08;information&#xff09; 我国著名的信息学专家钟义信教授认为“信息是事物存在方式或运动状态&#xff0c;以这种方式或状态直接或间接的表述”。 美国信息管理专家霍顿&#x…...