1836 字
约 6 分钟
2
重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」

重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」 作者:小傅哥

博客: https://bugstack.cn (opens new window) 沉淀、分享、成长,让自己和他人都能有所收获!😄 # 一、前言 好看的代码千篇一律,恶心的程序升职加薪。 该说不说几乎是程序员就都知道或者了解设计模式,但大部分小伙伴写代码总是习惯于一把梭。无论多少业务逻辑就一个类几千行,这样的开发也可以归纳为三步;定义属性、创建方法、调用展示,Done!只不过开发一时爽,重构火葬场。 好的代码不只为了完成现有功能,也会考虑后续扩展。在结构设计上松耦合易读易扩展,在领域实现上高内聚不对外暴漏实现细节不被外部干扰。而这就有点像家里三居(MVC)室、四居(DDD)室的装修,你不会允许几十万的房子把走线水管裸漏在外面,也不会允许把马桶放到厨房,炉灶安装到卫生间。 谁发明了设计模式? 设计模式的概念最早是由 克里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了城市设计的 “语言”,提供了253个描述城镇、邻里、住宅、花园、房间及西部构造的模式, 而此类 “语言” 的基本单元就是模式。后来, 埃里希·伽玛 、 约翰·弗利赛德斯 、 拉尔夫·约翰逊 和 理查德·赫尔姆 这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。 其实有一部分人并没有仔细阅读过设计模式的相关书籍和资料,但依旧可以编写出优秀的代码。这主要是由于在经过众多项目的锤炼和对程序设计的不断追求,从而在多年编程历程上提炼出来的心得体会。而这份经验最终会与设计模式提到的内容几乎一致,同样会要求高内聚、低耦合、可扩展、可复用。你可能也遇到类似的经历,在学习一些框架的源码时,发现它里的某些设计和你在做开发时一样。 我怎么学不会设计模式? 钱也花了,书也买了。代码还是一坨一坨的!设计模式是由多年的经验提炼出来开发指导思想。就像我告诉你自行车怎么骑、汽车怎么开,但只要你没跑过几千公里,你能记住的只是理论,想上道依旧很慌! 所以 ,本设计模式专题系列开始,会带着你使用设计模式的思想去优化代码。从而学习设计模式的心得并融入给自己。当然这里还需要多加练习,一定是 人车合一 ,才能站在设计模式的基础上构建出更加合理的代码。 # 二、开发环境 JDK 1.8 Idea + Maven 涉及工程三个,可以通过关注 公众号 : bugstack虫洞栈 ,回复 源码下载 获取。 你会获得一个连接打开后的列表中编号 18 : itstack-demo-design 工程 描述 itstack-demo-design-1-00 场景模拟工程,用于提供三组不同奖品的发放接口 itstack-demo-design-1-01 使用一坨代码实现业务需求,也是对ifelse的使用 itstack-demo-design-1-02 通过设计模式优化改造代码,产生对比性从而学习

- 1-00,1 代表着第一个设计模式,工厂方法模式
- 1-00,00 代表模拟的场景
- 1-01,01 代表第一种实现方案,后续 02 03 以此类推

三、工厂方法模式介绍

图片来自: https://refactoringguru.cn/design-patterns/factory-method (opens new window) 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可,同时,这也是去掉众多 ifelse 的方式。当然这可能也有一些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。 # 四、模拟发奖多种商品 为了可以让整个学习的案例更加贴近实际开发,这里模拟互联网中在营销场景下的业务。由于营销场景的复杂、多变、临时的特性,它所需要的设计需要更加深入,否则会经常面临各种紧急CRUD操作,从而让代码结构混乱不堪,难以维护。 在营销场景中经常会有某个用户做了一些操作;打卡、分享、留言、邀请注册等等,进行返利积分,最后通过积分再兑换商品,从而促活和拉新。 那么在这里我们模拟积分兑换中的发放多种类型商品,假如现在我们有如下三种类型的商品接口; 序号 类型 接口 1 优惠券 CouponResult sendCoupon(String uId, String couponNumber, String uuid) 2 实物商品 Boolean deliverGoods(DeliverReq req) 3 第三方爱奇艺兑换卡 void grantToken(String bindMobileNumber, String cardId) 从以上接口来看有如下信息: 三个接口返回类型不同,有对象类型、布尔类型、还有一个空类型。 入参不同,发放优惠券需要仿重、兑换卡需要卡ID、实物商品需要发货位置(对象中含有)。 另外可能会随着后续的业务的发展,会新增其他种商品类型。因为你所有的开发需求都是随着业务对市场的拓展而带来的。 # 五、用一坨坨代码实现 如果不考虑任何扩展性,只为了尽快满足需求,那么对这么几种奖励发放只需使用ifelse语句判断,调用不同的接口即可满足需求。可能这也是一些刚入门编程的小伙伴,常用的方式。接下来我们就先按照这样的方式来实现业务的需求。 # 1. 工程结构

itstack-demo-design-1-01
└── src
 ├── main
 │ └── java
 │ └── org.itstack.demo.design
 │ ├── AwardReq.java
 │ ├── AwardRes.java
 │ └── PrizeController.java 
 └── test
 └── java
 └── org.itstack.demo.design.test
 └── ApiTest.java

1 2 3 4 5 6 7 8 9 10 11 12

重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」
http://www.clxhxhhr.top/posts/3154/
作者
clxstart
发布于
2026-09-24
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。