当前位置: 首页 > 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…...

AMLP框架实战:基于MACE构建高精度机器学习势函数

1. 项目概述&#xff1a;当机器学习势函数遇上自动化管道在计算化学和材料科学领域&#xff0c;我们长久以来面临着一个核心矛盾&#xff1a;精度与效率的权衡。密度泛函理论&#xff08;DFT&#xff09;能提供接近实验的精度&#xff0c;但计算成本高昂&#xff0c;通常只能处…...

Godot中型项目工程化实践:目录规范、资源引用与状态管理

1. 这不是续集&#xff0c;而是项目落地的分水岭“Godot 游戏引擎项目&#xff08;二&#xff09;”——看到这个标题&#xff0c;很多人第一反应是&#xff1a;“哦&#xff0c;上一篇讲了环境搭建和Hello World&#xff0c;这篇该讲节点树和信号了&#xff1f;”但我在带三个…...

DeepSeek-R1补全能力封测倒计时(仅剩72小时开放API灰度权限):这份内部测试SOP已被3家头部科技公司紧急采购

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek-R1代码补全能力封测全景概览 DeepSeek-R1 是深度求索&#xff08;DeepSeek&#xff09;推出的高性能开源推理模型&#xff0c;在代码补全场景中展现出显著的上下文理解力与多语言泛化能力。本…...

长期使用Token Plan套餐在项目开发中的成本观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Token Plan套餐在项目开发中的成本观察 在AI驱动的项目开发中&#xff0c;成本控制与预算管理是团队负责人必须面对的现实…...

3大实战秘籍:揭秘raylib如何让游戏开发像搭积木一样简单

3大实战秘籍&#xff1a;揭秘raylib如何让游戏开发像搭积木一样简单 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib 你是否曾经被复杂的游戏引擎配置搞得焦头烂额…...

对比按量计费与Token Plan套餐的实际成本差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比按量计费与Token Plan套餐的实际成本差异 在构建和运营基于大模型的应用时&#xff0c;成本控制是一个核心的工程考量。Taotok…...

微信聊天图片丢了别慌!保姆级教程:找回并解密DAT文件(支持新旧版微信路径)

微信DAT图片恢复实战&#xff1a;从文件定位到批量解密的完整指南 微信聊天记录中的图片突然消失&#xff1f;别急着放弃&#xff01;那些看似无法打开的DAT文件里&#xff0c;可能藏着您的重要回忆或工作资料。本文将带您深入微信存储机制&#xff0c;手把手完成从文件定位到…...

实测对比,使用Taotoken聚合接口后Agent任务延迟与稳定性观感

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测记录&#xff1a;使用 Taotoken 聚合接口后 Agent 任务延迟与稳定性观感 效果展示类&#xff0c;记录将原有基于单一 API 的 A…...

如何高效实现Windows自动化鼠标点击:AutoClicker完整实战指南

如何高效实现Windows自动化鼠标点击&#xff1a;AutoClicker完整实战指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker AutoClicker是一款专业的Windows桌…...

AI算法工程师必学的Python库:这10个库,AI开发必备

对于软件测试从业者来说&#xff0c;随着人工智能技术在测试领域的渗透越来越深——从自动化测试用例生成到缺陷智能预测&#xff0c;从测试结果分析到测试环境智能化调度&#xff0c;掌握AI开发的核心工具链已经成为从功能测试向AI测试开发、智能化测试转型的核心竞争力。Pyth…...