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

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

是否存在路径(FIFOBB算法)

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

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...