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

设计模式——工厂模式

工厂模式

1.需求

抽奖活动

新用户注册即参与抽奖,奖品为:1.优惠券,2.优酷会员,3.京东卡

2.无模式

public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType = awardInfo.getAwardType();if(awardType == 1){DiscountService discountService = new DiscountService();discountService.send();return Result.success();}if(awardType == 2){YouKuService youkuService = new YouKuService;youkuService.send();return Result.success();}if(awardType == 3){JDService jdService = new JDService();jdService.send();return Result.success();}return Result.failed();}}

3.简单工厂模式

简单工厂模式包含以下特征:

  • 抽象产品
  • 具体产品
  • 具体工厂

3.1抽象产品

public interface IFreeGoods{boolean send();
}

3.2具体产品

public class DiscountService implements IFreeGoods{public boolean send(){System.out.println("发放打折券");return true;}
}
public class YouKuService implements IFreeGoods{public boolean send(){System.out.println("发放优酷会员");return true;}
}
public class JDCardService implements IFreeGoods{public boolean send(){System.out.println("发放京东卡");return true;}
}

3.3具体工厂

public class FreeGoodsServiceFactory{public static IFreeGoods getInstance(Integer awardType){if(awardType == 1){return new DiscountService();}if(awardType == 2){return new YouKuService();}if(awardType == 3){return new JDCardService();}return null;}
}
public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType = awardInfo.getAwardType();IFreeGoods freeGoods = FreeGoodsFServiceFactory.getInstance(awardType);if(freeGoods.send()){return Result.success();}else {return Result.failed();}}}

4.工厂方法模式

  • 抽象产品
  • 具体产品
  • 抽象工厂
  • 具体工厂

4.1抽象产品——定义产品的行为

public interface IFreeGoods{boolean send();
}

4.2具体产品——实现或继承抽象产品的子类

public DiscountFreeGoods implements IFreeGoods{public boolean send(){System.out.println("发放打折券");return true;}
}
public YouKuFreeGoods implements IFreeGoods{public boolean send(){System.out.println("发放优酷会员");return true;}
}
public JDFreeGoods implements IFreeGoods{public boolean send(){System.out.println("发放京东卡");return true;}
}

4.3抽象工厂——提供创建产品的接口

public interface FreeGoodsFactory{IFreeGoods createFreeGoods();
}

4.4具体工厂

public class DiscountFreeGoodsFactory implements FreeGoodsFacotry{public IFreeGoods createFreeGoods(){return new DiscountFreeGoods();}
}
public class YouKuFreeGoodsFactory implements FreeGoodsFacotry{public IFreeGoods createFreeGoods(){return new YoukuFreeGoods();}
}
public class JDFreeGoodsFactory implements FreeGoodsFacotry{public IFreeGoods createFreeGoods(){return new JDFreeGoods();}
}

5.抽象工厂模式

基于上述拉新人注册的需求进行扩展

之前是的奖品为:平台的打折券、优酷的月卡、京东的小礼品

现在的奖品为:平台的打折券、平台的会员卡,优酷的月卡打折券、优酷的月卡,京东的商品打折券、京东会员卡

由现在的需求可以看出,打折券、会员卡可以归为一类,奖品提供方可以归为另一类

打折券发放以后可以购买相关平台的指定商品

会员卡发放以后需要绑定相关平台的用户账户

由此引出了产品族以及产品等级结构的概念

5.1产品等级结构

产品等级结构即产品的继承结构,如一个抽象类是打折券,其子类有平台的打折券、优酷的打折券、京东的打折券;

5.2产品族

产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,比如平台的工厂生产平台的打折券,生产平台的会员卡

5.3抽象工厂模式的具体特征

  • 抽象产品(产品等级结构父类)
  • 具体产品(产品等级结构子类)
  • 抽象工厂(产品族父类)
  • 具体工厂(产品族子类)

5.4抽象产品

public interface IFreeGoods{boolean send();
}
public abstract class DiscountFreeGoods extends IFreeGoods{// 获取售卖的商品List getSaleList();// 计算价格BigDecimal calc(BigDecimal price);
}
public abstract class VipCardFreeGoods extends IFreeGoods {boolean bindAccount(Long phoneNumber);
}

5.5抽象工厂

public interface FreeGoodsFactory{DiscountFreeGoods createDiscountFreeGoods();VipCardFreeGoods createVipCardFreeGoods();
}

5.6具体产品

5.6.1打折券的具体实现

public class PlatformDiscountFreeGoods extends DiscountFreeGoods {public boolean send(){System.out.println("发放平台打折券");}public List getSaleList(){// 这里返回平台售卖的商品}public BigDecimal calc(BigDecimal price){// 这里计算平台打折券使用后的优惠价格}
}
public class YoukuDiscountFreeGoods extends DiscountFreeGoods {public boolean send(){System.out.println("发放优酷打折券");}public List getSaleList(){// 这里调用优酷的接口返回优酷售卖的商品}public BigDecimal calc(BigDecimal price){// 这里调用用户的接口计算打折券使用后的优惠价格}
}
public class JDDiscountFreeGoods extends DisCountFreeGoods {public boolean send(){System.out.println("发放京东打折券");}public List getSaleList(){// 这里调用京东的接口返回京东售卖的商品}public BigDecimal calc(BigDecimal price){// 这里调用京东的接口计算打折券使用后的优惠价格}
}

5.6.2会员卡的具体实现

public class PlatformVipCardFreeGoods extends VipCardFreeGoods {public boolean send(){System.out.println("发放京东会员卡");}public boolean bindAccount(Long phoneNumber) {// 这里绑定平台账号}
}
public class YouKuVipCardFreeGoods extends VipCardFreeGoods {public boolean send(){System.out.println("发放京东会员卡");}public boolean bindAccount(Long phoneNumber) {// 这里调用优酷的接口,传手机号过去绑定用户账号}
}
public class JDVipCardFreeGoods extends VipCardFreeGoods {public boolean send(){System.out.println("发放京东会员卡");}public boolean bindAccount(Long phoneNumber) {// 这里调用京东的接口,传手机号过去绑定用户账号}
}

5.7具体工厂

public class PlatformFreeGoodsFactory implements FreeGoodsFactory {public DiscountFreeGoods createFreeGoods(){return new PlatformDiscountFreeGoods();}public VipCardFreeGoods createVipCardFreeGoods(){return new PlatformVipCardFreeGoods();}
}
public class YouKuFreeGoodsFactory implements FreeGoodsFactory {public DiscountFreeGoods createFreeGoods(){return new YoukuDiscountFreeGoods();}public VipCardFreeGoods createVipCardFreeGoods(){return new YouKuVipCardFreeGoods();}
}
public class JDFreeGoodsFactory implements FreeGoodsFactory {public DiscountFreeGoods createFreeGoods(){return new JDDiscountFreeGoods();}public VipCardFreeGoods createVipCardFreeGoods(){return new JDVipCardFreeGoods();}
}

5.8调用

public class Client {private DiscountFreeGoods discountFreeGoods;private VipCardFreeGoods vipCardFreeGoods;public Client(FreeGoodsFactory factory){this.discountFreeGoods = factory.createDiscountFreeGoods();this.vipCardFreeGoods = factory.createVipCardFreeGoods();}// 省略 get和set
}

相关文章:

设计模式——工厂模式

工厂模式 1.需求 抽奖活动 新用户注册即参与抽奖&#xff0c;奖品为&#xff1a;1.优惠券&#xff0c;2.优酷会员&#xff0c;3.京东卡 2.无模式 public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType awardInfo.getAward…...

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…...

设计模式浅谈

什么是设计模式 设计模式是一种软件设计的思想。是在软件开发过程中&#xff0c;经过验证的、用于解决在特定环境下重复出现的、特定问题的解决方案。 设计模式的设计原则 原文链接&#xff1a;https://blog.csdn.net/qq_43471489/article/details/124067150 设计原则 1、…...

【kubernetes】使用crictl对k8s节点进行调试

crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 可以Github上下载最新的发布版本: https://github.com/kubernetes-sigs/cri-tools/releases 包名大小发布日期...

数字经济讨论题

自2001年以来&#xff0c;Alphabet&#xff08;Google&#xff09;已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…...

gcc/g++、动静态库、make/makefile

目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言&#xff0c;使用gcc或者g并没有什么区别。而对于cpp文件&#xff0c;在预处理、编译、汇编这三部分&#xff0c;…...

北京博奥智源,浅谈图书馆的馆情展示系统细则

功能特点&#xff1a; 1、支持智慧大屏的定制&#xff0c;内置精美的主题模板。 2、提供丰富的数据模块&#xff0c;可通过拖拽自由组合&#xff0c;配置灵活。 3、支持屏幕分辨率自定义&#xff0c;自适应屏幕大小。 4、支持背景颜色的更换&#xff0c;同时可上传图片更换背景…...

Docker----------day-mysql8主从复制

1.安装master 1.1拉取镜像 docker search mysql docker pull mysql mkdir -p /home/mysql8/data mkdir -p /home/mysql8/conf mkdir -p /home/mysql8/log1.2 2.启动交互式添加容器数据卷 #不添加容器数据卷 docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASS…...

【Nginx】【一】Nginx简介

Nginx简介 背景介绍 Nginx&#xff08;“engine x”&#xff09;一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个【POP3/SMTP/IMAP代理服务器】&#xff0c;是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的&#xff0c;Nginx的第一个版本是200…...

跳跃游戏II-力扣45-java 动态规划

一、题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - …...

【算法】用python代码解决“鬼谷问徒”问题

文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限&#xff0c;我自己花了两个小时才实现&#xff0c;不过解决问题的过程还是很快乐的。题目 一天&#xff0c;鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…...

【1】linux命令每日分享——mkdir创建目录

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…...

TPM 2.0实例探索1

1. 获取用户名 命令及结果如下所示&#xff1a; $ whoami ph2. 获取设备序列号&#xff08;串号&#xff09; 命令及结果如下所示&#xff1a; $ sudo dmidecode | grep "Serial Number" | head -n 1Serial Number: MP260S483. 将用户名和设备序列号放入到一个文…...

buu [BJDCTF2020]signin 1

题目描述&#xff1a; 题目分析&#xff1a; 打开发现是16 进制数&#xff08;我也不知道我是怎么发现的&#xff0c;先是尝试了md5和rot-n,发现都不行&#xff0c;然后参考大佬的才知道是16进制&#xff09;使用 在线16进制转字符串 便能得到 flag但我如果不想用线上工具&…...

Storage

WebStorage主要提供了一种机制&#xff0c;可以让浏览器提供一种比cookie更直观的key、value存储方式&#xff1a; localStorage&#xff1a;本地存储&#xff0c;提供的是一种永久性的存储方法&#xff0c;在关闭掉网页重新打开时&#xff0c;存储的内容依然保留&#xff1b;…...

CAS底层原理及ABA问题

一、案例CAS是Java中Unsafe类里面的一个方法&#xff0c;它的全称是叫CompareAndSwap比较并交换的一个意思&#xff0c;它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。例如&#xff0c;比如说像这样一个场景&#xff0c;有一个成员变量state&#xf…...

华为OD机试真题Python实现【单词反转】真题+解题思路+代码(20222023)

题目 输入一个英文文章片段, 翻转指定区域的单词顺序, 标点符号和普通字母一样处理, 例如输入字符串 I am a developer. [0,3] 则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 使用换行隔开 3 个参数 第一…...

嵌入式linux驱动学习-用cdev代替register_chrdev()

​上回说到字符设备驱动程序的注册与销毁register_chrdev()和unregister_chrdev()这是有缺陷的。 嵌入式lnux驱动学习-2.一个驱动程序的流程 现在用另外一个更好的方法代替&#xff0c;我们先来看看register_chrdev()实际上是调用了 __register_chrdev(major, 0, 256, name,…...

技术更新!10个MySQL性能调优技巧

MySQL是世界上使用最广泛的开源数据库&#xff0c;它在业界的受欢迎程度让其他数据库望尘莫及。它是一个关系型数据库管理系统&#xff0c;多年来依然是应用程序的核心。在过去几年里&#xff0c;MySQL有一些重要发展。因此&#xff0c;整理更新10个MySQL性能调优技巧。 模式设…...

ICLR 2023|VLDet:从图像-文本对中学习区域-词语对齐的开放词汇式目标检测

原文链接&#xff1a;https://www.techbeat.net/article-info?id4614&isPreview1 作者&#xff1a;林闯 目标检测任务在AI工业界具有非常广泛的应用&#xff0c;但由于数据获取和标注的昂贵&#xff0c;检测的目标一直被限制在预先设定好的有限类别上。而在学术界&#xf…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...