【聊一聊】三种工厂模式的创建

三种工厂模式的创建

在这里插入图片描述

今天终于星期五了,最近由于碰上一个需求,中间涉及Oracle改国产数据库的改造,好家伙,差点没把我忙坏了

不过今天终于有空啦!~哈哈哈

这篇本应该是上周就结束的,但是拖到今天,我们就今天进行结束

(还有一件快乐的事情,就是我遇见自己喜欢的人啦!嘻嘻)

好啦!~话不多说,我们进入今天的正题

本文总纲

我始终 认为一份思维导图是很重要的,建议大家也跟着建立一遍,绝对有着更上一层楼的感觉.(Just do it~ OK !)

在这里插入图片描述


我们主要进行用案例来掌握者几种模式,以练代学!!!效率绝对杠杠的


案例解析:(看对比,推荐敲一遍!~)

下面我们用一个案例来说明: 【在Spring环境下实现】

我们分别定义加减乘除类为了达到模拟计算机的效果

没有引入抽象模式时:

首先看执行类

  • 比如下面我们执行加法运算时,我们就要创建一个OperationSub的类

换句话说:

  • 我们要使用不同的运算时,就要创建不同的类,并且明确知道该类的名称(就是我们平时的显示new一个对象)
package com.byv.design_patterns;public class Test {/*** 定义一个执行类* @param args*/public static void main(String[] args) {AddOper addOper = new AddOper();addOper.setVal1(2);addOper.setVal2(3);System.out.println(addOper.getRes());}
}

抽象基类:

package com.byv.design_patterns;import lombok.Data;import java.math.BigDecimal;/*** 抽象类: 计算机基类* 抽取公共逻辑*/
@Data
public abstract class Operation {//计算的元素private int val1=0;private int val2=0;/*** 获取计算的结果,只能由子类来实现* @return*/protected abstract int getRes();
}

加法类

package com.byv.design_patterns;/*** 加法类*/
public class AddOper extends Operation{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()+getVal2();}
}

除法类

-----------------
package com.byv.design_patterns;/*** 除法类*/
public class DivisionOper extends Operation{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {//判断是否除数合法return getVal2()!=0?getVal1()/getVal2():Integer.MIN_VALUE;}
}

乘法类

---------------
package com.byv.design_patterns;/*** 乘法类*/
public class MulticleOper extends Operation{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()*getVal2();}
}

减法类

------------
package com.byv.design_patterns;/*** 减法类*/
public class SubOper extends Operation{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()-getVal2();}
}

1.简单工厂模式

Static Factory Method:就是最简单的,上来不管三七二十一,就是把所有的对象(就是工厂) 给建造出来

上篇的工厂模式已经说过:简单工厂模式由一个工厂对象决定创建出哪一种产品实例

我们也看到上面没有采用设计模式的麻烦,那么我们怎么用简单工厂模式实现呢?(你可能会说,说啊!~别急啊,哈哈我们往下看)

再说实现之前,我们现看看简工框架组成()

三者关系图:

在这里插入图片描述

Factory:

  • 这是本模式的核心,含有一定的商业逻辑和判断逻辑
  • Java中往往由一个具体类实现(OperationFactory)

Product:

  • 他一般是具体产品继承父类或者实现的接口
  • Java中由接口或者抽象类实现(Operation)

ConcretProduct:

  • 工厂类所创建的对象就是此角色的实例
  • Java由一个具体类实现
  • 来用类图来清晰的表示下的他们之间的关系(OperationAdd\OperationSub)

案例:简单工厂模式实现

package com.byv.design_patterns;import lombok.extern.java.Log;/*** 简单工厂模式*/
public class OperationFactory {//将所有的工厂对象创建出来,看下面的就知道public static Operation createOperation(String operation){Operation oper=null;switch (operation){case "+":oper=new AddOper();break;case "-":oper=new SubOper();break;case "*":oper=new MulticleOper();break;case "/":oper=new DivisionOper();default:System.out.println(" 输入非法,不支持此计算方式");}return oper;}
}

怎么调用?

上面的工厂类创建出来后,使用工厂创建对象(注意看,~我们用工厂,仔细推敲)

我们看到同样是创建一个加法运算的创建

package com.byv.design_patterns;import com.byv.design_patterns.static_factory.OperationFactory;public class Test {/*** 定义一个执行类* @param args*/public static void main(String[] args) {//不用设计模式的AddOper addOper = new AddOper();addOper.setVal1(2);addOper.setVal2(3);System.out.println(addOper.getRes());//使用简单工厂模式//这一步真的很关键Operation operationAdd= OperationFactory.createOperation("+");operationAdd.setVal1(2);operationAdd.setVal2(3);System.out.printf(operationAdd.getRes()+"");}
}

工厂方法模式

这个怎么理解呢,就是更智能了,用户可以根据哪个创建哪个
在设计模式上完全符合"开闭原则"

工厂模式实现方式

关系图

Product: 抽象产品Operation

ConcreteProduct: 具体产品 ---->operationAdd

Factory: 抽象工厂 IFactory

ConcreteFactory: 具体工厂(AddFactory)

在这里插入图片描述

案例代码实现

package com.byv.design_patterns.satand_factory;import com.byv.design_patterns.Operation;/*** 减法类*/
public class SubOper extends Operation implements IFactory{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()-getVal2();}@Overridepublic Operation Creation() {return new SubOper();}
}package com.byv.design_patterns.satand_factory;import com.byv.design_patterns.Operation;/*** 乘法类*/
public class MulticleOper extends Operation implements IFactory{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()*getVal2();}@Overridepublic Operation Creation() {return new MulticleOper();}
}package com.byv.design_patterns.satand_factory;import com.byv.design_patterns.Operation;/*** 除法类*/
public class DivisionOper extends Operation implements IFactory{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {//判断是否除数合法return getVal2()!=0?getVal1()/getVal2():Integer.MIN_VALUE;}@Overridepublic Operation Creation() {return new DivisionOper();}
}package com.byv.design_patterns.satand_factory;import com.byv.design_patterns.Operation;/*** 加法类*/
public class AddOper extends Operation implements IFactory{//继承父类,实现自己的计算逻辑@Overrideprotected int getRes() {return getVal1()+getVal2();}@Overridepublic Operation Creation() {return new AddOper();}
}

怎么调用?

package com.byv.design_patterns;import com.byv.design_patterns.satand_factory.IFactory;
import com.byv.design_patterns.static_factory.OperationFactory;public class Test {/*** 定义一个执行类* @param args*/public static void main(String[] args) {//不用设计模式的AddOper addOper = new AddOper();addOper.setVal1(2);addOper.setVal2(3);System.out.println(addOper.getRes());//使用简单工厂模式//这一步真的很关键Operation operationAdd= OperationFactory.createOperation("+");operationAdd.setVal1(2);operationAdd.setVal2(3);System.out.printf(operationAdd.getRes()+"");//使用工厂模式IFactory factory=new com.byv.design_patterns.satand_factory.AddOper();Operation operationStandAdd=factory.Creation();operationAdd.setVal1(2);operationAdd.setVal2(3);System.out.printf(operationAdd.getRes()+"");}
}

思考!(后面补充)

为什么要使用工厂创建对象?

为什么每种对象要单独有一个工厂?

抽象工厂模式

抽象工厂模式包含如下角色:

  1. AbstractFactory(抽象工厂):用于声明生成抽象产品的方法
  2. ConcreteFactory(具体工厂):实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;
  3. AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;
  4. Product(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

采用一个汽车代工厂造汽车的例子。假设我们是一家汽车代工厂商,我们负责给奔驰和特斯拉两家公司制造车子。我们简单的把奔驰车理解为需要加油的车,特斯拉为需要充电的车。其中奔驰车中包含跑车和商务车两种,特斯拉同样也包含跑车和商务车。

下面是抽象产品,奔驰车和特斯拉车:

public interface BenzCar {//加汽油public void gasUp();}public interface TeslaCar {//充电public void charge();
}

下面是具体产品,奔驰跑车、奔驰商务车、特斯拉跑车、特斯拉商务车:

public class BenzSportCar implements BenzCar {public void gasUp() {System.out.println("给我的奔驰跑车加最好的汽油");}
}public class BenzBusinessCar implements BenzCar{public void gasUp() {System.out.println("给我的奔驰商务车加一般的汽油");}
}public class TeslaSportCar implements TeslaCar {public void charge() {System.out.println("给我特斯拉跑车冲满电");}
}public class TeslaBusinessCar implements TeslaCar {public void charge() {System.out.println("不用给我特斯拉商务车冲满电");}
}

下面是抽象工厂:

public interface CarFactory {public BenzCar getBenzCar();public TeslaCar getTeslaCar();
}

下面是具体工厂

public class SportCarFactory implements CarFactory {public BenzCar getBenzCar() {return new BenzSportCar();}public TeslaCar getTeslaCar() {return new TeslaSportCar();}
}public class BusinessCarFactory implements CarFactory {public BenzCar getBenzCar() {return new BenzBusinessCar();}public TeslaCar getTeslaCar() {return new TeslaBusinessCar();}
}

思考!

“开闭原则”的倾斜性是什么?

好了完结撒花(今晚写到这!~哈哈哈哈!)
在这里插入图片描述

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

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

相关文章

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

Linux第83步_采用“Linux内核定时器”点灯以及相关API函数

“Linux内核定时器”是采用“系统时钟”来实现的。它不是周期性运行的,一旦发生超时就会自动关闭。如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。 Limux内核使用全局变量jiffies来记录“系统从启动以来的系统节拍数”&#xff0c…

路由器的端口映射能实现什么?

路由器的端口映射是一项重要的网络配置功能,它可以帮助实现局域网内外的设备之间的通信。通过端口映射,我们可以在公网上访问局域网内的设备,方便的进行远程访问、共享文件和资源等操作。 什么是端口映射? 在介绍端口映射之前&am…

【springcloud开发教程】spring cloud config——分布式配置

什么是SpringCloud config分布式配置中心? spring cloud config 为微服务架构中的微服务提供集中化的外部支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。 spring cloud config 分为服务端和客户端两部分。 服务端也称为 …

MySQL 查询性能优化

优质博文:IT-BLOG-CN​ 如果把查询看作是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数。通常…

【prometheus-operator】k8s监控redis

1、准备exporter https://github.com/oliver006/redis_exporter oliver006-redis_exporter-amd64.tar # 安装镜像 docker load -i oliver006-redis_exporter-amd64.tar # 上传镜像 docker tag oliver006/redis_exporter ip/monitor/redis_exporter:latest docker push ip/mo…

DevEco Profiler性能调优工具简介

一、概述 应用或服务运行期间可能出现响应速度慢、动画播放不流畅、列表拖动卡顿、应用崩溃或耗电量过高、发烫、交互延迟等现象,这些现象表明应用或服务可能存在性能问题。造成性能问题的原因可能是业务逻辑、应用代码对系统API的误用、对ArkTS对象的不合理持有导致内存泄露…

记录开发STM32遇到的卡死问题-串口

背景:以STM32作为主控,广州大彩显示屏显示,主控实时采集数据,串口波特率115200.设置收发频率为50Hz,即单片机每秒发送50帧数据,每秒接收50帧数据,每帧数据大概14字节。 问题:系统长…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP:31940 部署k8集群…

隐私计算实训营学习三:隐私计算框架的架构和技术要点

文章目录 一、隐语架构二、产品层三、算法层3.1 PSI与PIR3.2 Data Analysis-SCQL3.3 Federated Learning 四、计算层4.1 混合调度编译-RayFed4.2 密态引擎4.3 密码原语YACL 五、资源管理层六、互联互通七、跨域管控 一、隐语架构 1、完备性:支持多种技术&#xff0…

基于Springboot的牙科就诊管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的牙科就诊管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&#xff0c…

RocketMq 顺序消费、分区消息、延迟发送消息、Topic、tag分类 实战 (消费者) (三)

消费端配置 如下所示:是消费者的配置类,有以下几点需要注意的地方 1、是TargetMessageListener这个监听类(下文会把这个监听类的具体代码贴出来),需要把这个监听类订阅。 2、rocketMqDcProperties.getTargetProperties…

【机器学习】k近邻(k-nearest neighbor )算法

文章目录 0. 前言1. 算法原理1.1 距离度量1.2 参数k的选择 2. 优缺点及适用场景3. 改进和扩展4. 案例5. 总结 0. 前言 k近邻(k-nearest neighbors,KNN)算法是一种基本的监督学习算法,用于分类和回归问题。k值的选择、距离度量及分…

Linux中Oracle数据库启动顺序

首先使用oracle用户登录Linux,用lsnrctl status查看监听状态 1、:进入sqlplus $ sqlplus /nolog SQL> 2:使用sysdab角色登录sqlplus SQL> conn /as sysdba 3:启动数据库 SQL> startup 4:打开Oracle监听 …

微信小程序 - picker-viewer实现省市选择器

简介 本文会基于微信小程序picker viewer组件实现省市选择器的功能。 实现效果 实现代码 布局 <picker-view value"{{value}}" bindchange"bindChange" indicator-style"height: 50px;" style"width: 100%; height: 300px;" &…

OCR研究背景及相关论文分享

光学字符识别&#xff08;Optical Character Recognition&#xff0c;OCR&#xff09;是指使用光学方法将图像中的文字转换为机器可编辑的文本的技术。OCR技术的研究和应用已有数十年的历史&#xff0c;其背景和发展受到多方面因素的影响。 技术需求背景 1.自动化文档处理&am…

【数据分享】2012-2023年全球范围逐年NPP/VIIRS夜间灯光数据

夜间灯光数据是我们在各项研究中经常使用的数据&#xff01;本次我们给大家分享的是2012-2023年全球范围的逐年的NPP/VIIRS夜间灯光数据&#xff0c;数据格式为栅格格式(.tif)。该数据来自于NCEI国家环境信息中心&#xff0c;近期该网站更新了2023年的夜间灯光数据&#xff0c;…

电脑如何关闭自启动应用?cmd一招解决问题

很多小伙伴说电脑刚开机就卡的和定格动画似的&#xff0c;cmd一招解决问题&#xff1a; CtrlR打开cmd,输入&#xff1a;msconfig 进入到这个界面&#xff1a; 点击启动&#xff1a; 打开任务管理器&#xff0c;禁用不要的自启动应用就ok了

Linux——进程间通信管道

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程间通信1、进程间通信的目的2、进程间通信发展3、进程间通信分类 二、管道1、什么是管…

tcp 协议详解

什么是 TCP 协议 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。TCP 是一个传输层的协议。 如下图&#xff1a; 我们接下来在讲解 TCP/IP 协议栈的下三层时都会先解决这两个问题&#xff1a; 报头与有效载荷如何…