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

Pixel Couplet Gen实操手册:自定义门神像素图替换与SVG动画扩展方法

Pixel Couplet Gen实操手册&#xff1a;自定义门神像素图替换与SVG动画扩展方法 1. 项目概述 Pixel Couplet Gen是一款融合传统春节元素与现代像素艺术风格的AI春联生成工具。通过ModelScope大模型的文本生成能力&#xff0c;结合精心设计的8-bit视觉风格&#xff0c;为用户提…...

Git开源贡献全指南:从入门到精通

开源项目Git贡献全流程拆解 理解开源项目贡献的基本概念 开源项目的定义与意义Git在开源协作中的核心作用常见的开源贡献类型&#xff08;代码、文档、测试等&#xff09; 准备开发环境 安装Git并完成基础配置&#xff08;用户名、邮箱、SSH密钥&#xff09;注册GitHub/GitLab等…...

3GPP TS 23.256标准解读:无人机广播远程识别码(Broadcast Remote ID)到底是怎么工作的?

3GPP TS 23.256标准深度解析&#xff1a;无人机广播远程识别码的技术实现与合规路径 当一架无人机在城市上空盘旋时&#xff0c;地面人员如何快速确认它的合法身份&#xff1f;监管机构又该如何在密集的无线电环境中精准捕捉每一架飞行器的信息&#xff1f;这些问题的答案&…...

7大维度测评:2023年开源付费墙绕过工具终极选择指南

7大维度测评&#xff1a;2023年开源付费墙绕过工具终极选择指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容访问需求日益增长的今天&#xff0c;选择一款高效可靠的开源…...

特朗普政府发布《国家人工智能立法框架》,多维度布局AI领域

【《国家人工智能立法框架》六大核心目标锚定AI发展方向】特朗普政府发布的《国家人工智能立法框架》&#xff0c;意在通过统一国家政策确保美国在AI领域的全球领先地位。该框架包含六大核心目标&#xff0c;分别是保护儿童与赋能家长、维护与强化美国社区、尊重知识产权与支持…...

UnityLockstep:构建零延迟多人游戏的终极同步框架

UnityLockstep&#xff1a;构建零延迟多人游戏的终极同步框架 【免费下载链接】UnityLockstep Deterministic Lockstep with clientside prediction and rollback 项目地址: https://gitcode.com/gh_mirrors/un/UnityLockstep 在多人游戏开发中&#xff0c;你是否曾为网…...

番茄小说下载器:Rust构建的高性能离线阅读解决方案

番茄小说下载器&#xff1a;Rust构建的高性能离线阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代&#xff0c;网络依赖、格式不兼容和下载效率低下…...

苹果设备激活锁终极解锁指南:5步免费绕开iOS 15-16的iCloud限制

苹果设备激活锁终极解锁指南&#xff1a;5步免费绕开iOS 15-16的iCloud限制 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 还在为忘记Apple ID密码而无法使用自己的iPhone或iPad而烦恼吗&#xff1f;…...

突破方舟生存进化技术壁垒的智能管理工具

突破方舟生存进化技术壁垒的智能管理工具 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher 你是否曾因MOD安装顺序错误导致游戏频繁崩溃&#xff1f;是否在搭建私人服务器时被端口配置弄得晕…...

【系统架构设计师-案例题(5)】人工智能 · 参考答案与解析(按分类)

文章目录目录一、机器学习基本概念单选 迁移学习单选 强化学习的核心特点二、人工智能分类&#xff08;弱人工智能与强人工智能&#xff09;单选 主要区别三、人工智能关键技术单选 说法错误项&#xff08;选非&#xff09;单选 哪项不是人工智能关键技术&#xff08;选非…...