后端让写前端(工厂模式通关指南:3 种玩法 + 实战代码,程序员秒懂不头大)

后端让写前端(工厂模式通关指南:3 种玩法 + 实战代码,程序员秒懂不头大)
工厂模式通关指南:3 种玩法 + 实战代码,程序员秒懂不头大

宝子们谁懂啊!写代码最怕啥?硬邦邦的 new 对象堆一堆,后期改需求直接原地爆炸,CV 工程师看了都摇头,祖传代码直接变成 “祖传 BUG”!而工厂模式就是拯救我们的「对象创建神器」,作为设计模式里的 “入门必学款”,学会它,代码解耦、易维护直接拉满,从此告别面向百度编程,做个有追求的程序员!

今天咱不整干巴巴的八股文,用电商商品上架的接地气场景,唠透简单工厂、工厂方法、抽象工厂这 3 种模式,附完整 Java 代码,幽默人话版讲解 + 程序员专属梗,看完直呼 “原来这么简单,之前白头秃了”!

一、先打基础:软件设计七大原则(装 X + 实战都够用,面试还能吹)

所有设计模式的底层逻辑都是这 7 个原则,说白了就是让代码 “好伺候”,别动不动就崩,毕竟程序员的时间,要么用来摸鱼,要么用来解决之前写的烂代码。一句话总结,好记到离谱:

表格

后端让写前端(工厂模式通关指南:3 种玩法 + 实战代码,程序员秒懂不头大)

原则

人话版核心

程序员梗版解读

开闭原则

加功能随便加,别动我原来的代码♂️

新增需求别改老代码,不然 BUG 追着跑

依赖倒置原则

别直接依赖具体类,跟抽象层 “处对象”,松耦合不粘人

面向抽象编程,别做面向具体类的舔狗

单一职责原则

一个类 / 方法就干一件事,别当 “全能卷王”

别让类既当爹又当妈,会累趴的

接口隔离原则

接口别搞大杂烩,用啥给啥,不强迫别人要无用的功能

接口别写大而全,不然调用方直呼焯

迪米特法则

少管闲事!对依赖的类知道越少越好,别刨根问底

事不关己高高挂起,代码界的摸鱼准则

里氏替换原则

子类可以给父类 “升级”,但不能改父类的 “祖传功能”

子类可以秀操作,但别乱改父类的祖传代码

二、工厂模式核心思想:懒人福音,告别手动 new 对象,拒绝重复造轮子

简单说,工厂模式就是找个 “专属工厂” 帮你创建对象✅,你只管拿对象用,不用关心它咋造的、初始化啥参数,主打一个 “拿来主义”。

这就像你点外卖,只管说要 “黄焖鸡米饭”,不用自己买菜、做饭、洗碗 —— 工厂就是外卖店,对象就是外卖,咱程序员的宗旨是:能让代码干活,就别自己手动干,重复造轮子的事咱不干!

它分 3 个进阶玩法,从青铜到王者,适配不同业务场景,咱挨个唠~

三、简单工厂模式:新手村入门,懒人速通款(非 GOF23 种,青铜选手必备)

✅适用场景

产品类型少(3 种以内)、业务贼简单,比如小商铺只卖手机、服饰,懒得搞复杂逻辑,主打一个快速开发,早写完早摸鱼。

核心定义

一个 “万能小工厂”,传个参数就给你造对应对象,一站式服务,堪比代码界的 “万能充”。

实战代码(电商商品上架)

// 1. 定义产品接口:所有商品都要实现的“上架规矩”public interface IGoods {    void putOnShelf(); // 商品上架方法}// 2. 具体商品类:手机和服饰,各有各的上架姿势public class PhoneGoods implements IGoods {    @Override    public void putOnShelf() {        System.out.println("手机仔完成串码质检,蹦跶着上架数码区~");    }}public class ClothGoods implements IGoods {    @Override    public void putOnShelf() {        System.out.println("衣服妹测完尺码,美美上架服饰区~");    }}// 3. 万能小工厂:商品造造造工厂,传参就干活,别让我加班public class GoodsFactory {    // 方式1:传字符串造对象,新手一看就会,零门槛    public IGoods create(String goodsType) {        if ("phone".equals(goodsType)) return new PhoneGoods();        if ("cloth".equals(goodsType)) return new ClothGoods();        throw new IllegalArgumentException("这商品咱工厂造不了,别为难我~加班也不造");    }    // 方式2:传Class对象,优雅解耦,避免硬编码(老鸟推荐,面试加分)    public IGoods create(Class<!--? extends IGoods--> clazz) {        try {            return clazz.newInstance();        } catch (Exception e) {            throw new RuntimeException("造对象翻车了!BUG出现,程序员连夜跑路~");        }    }}// 4. 客户端调用:咱只管拿对象用,爽就完事了,剩下的时间摸鱼public class SimpleFactoryTest {    public static void main(String[] args) {        GoodsFactory factory = new GoodsFactory();        // 传字符串造手机        IGoods phone = factory.create("phone");        phone.putOnShelf();        // 传Class造服饰(推荐,避免硬编码,少写BUG)        IGoods cloth = factory.create(ClothGoods.class);        cloth.putOnShelf();    }}

优缺点大吐槽

✅ 优点:新手友好,一行代码造对象,告别手动 new,懒人狂喜;零学习成本,CV 工程师也能秒会,早写完早下班;

❌ 缺点:工厂成了 “卷王打工人”,啥活都干,新增商品(如家电)得改工厂代码,违反开闭原则,产品多了直接累趴,后期维护直接变成 “面向 BUG 编程”。

源码彩蛋

JDK 的Calendar.getInstance()、logback 的LoggerFactory.getLogger(),全是这货的经典实现,日常开发天天见,相当于代码界的 “国民小吃”,随处可见!

四、工厂方法模式:进阶版,给工厂 “分班干活”(GOF23 种,黄金选手标配)

✅适用场景

产品类型多,每个产品还有专属创建逻辑(比如手机要验串码、服饰要测尺码),再让一个工厂干,它真的会谢,毕竟程序员都不想 996,工厂也不想!

核心定义

别搞万能工厂了,** 给每个产品配个 “专属工厂”**,手机工厂只造手机,服饰工厂只造服饰,专人干专事,不卷不累,堪比代码界的 “部门分工”,产品部只做产品,技术部只写代码。

实战代码(电商商品升级版)



// 1. 产品接口:还是那个上架规矩,不变,祖传规范不能改public interface IGoods {    void putOnShelf();}// 2. 具体商品类:新增专属创建逻辑,更贴实际,拒绝摆烂public class PhoneGoods implements IGoods {    @Override    public void putOnShelf() {        System.out.println("手机仔:先验串码,再质检,妥了上架~别出BUG,不然程序员要头秃");    }}public class ClothGoods implements IGoods {    @Override    public void putOnShelf() {        System.out.println("衣服妹:先测尺码,再熨烫,美美的上架~主打一个精致,不做摆烂商品");    }}// 3. 工厂接口:给所有工厂定规矩,必须实现造对象方法,代码界的员工手册public interface IGoodsFactory {    IGoods createGoods();}// 4. 专属工厂1:手机工厂,只造手机,懂手机的小能手,不跨界卷public class PhoneFactory implements IGoodsFactory {    @Override    public IGoods createGoods() {        System.out.println("手机工厂开工:初始化串码信息~开工不摸鱼,下班准点走");        return new PhoneGoods();    }}// 5. 专属工厂2:服饰工厂,只造服饰,懂穿搭的小能手,专业的人做专业的事public class ClothFactory implements IGoodsFactory {    @Override    public IGoods createGoods() {        System.out.println("服饰工厂开工:初始化尺码信息~拒绝996,高效干活");        return new ClothGoods();    }}// 6. 客户端调用:找对应工厂,拿对应对象,思路贼清晰,后期维护不头秃public class FactoryMethodTest {    public static void main(String[] args) {        // 造手机找手机工厂,不用管它咋造的,主打一个甩手掌柜        IGoodsFactory phoneFactory = new PhoneFactory();        phoneFactory.createGoods().putOnShelf();        // 造服饰找服饰工厂,各司其职,别串岗,代码界的职场准则        IGoodsFactory clothFactory = new ClothFactory();        clothFactory.createGoods().putOnShelf();    }}

优缺点大吐槽

✅ 优点:新增商品只需「加产品类 + 加对应工厂类」,不用改原有代码,符合开闭原则,后期维护不头大;各工厂职责单一,翻车了只影响自己,不连累别人,避免 “一个 BUG 崩掉整个项目” 的惨案;

❌ 缺点:产品和工厂一一绑定,类的数量直接翻倍,系统变 “抽象” 了,新手刚看会有点懵,直呼 “这代码写的是啥,我是谁我在哪”。

✨核心优势

彻底解决简单工厂 “一人干所有活” 的 996 痛点,主打一个 “分工明确,快乐打工”,中大型项目必用,毕竟大厂都讲究分工,代码也一样!

五、抽象工厂模式:王者版,造 “全家桶产品”(GOF23 种,架构师专属)

✅适用场景

存在产品族(一组相关联的产品,像 “肯德基全家桶”),比如手机产品族 = 手机本体 + 手机贴膜,服饰产品族 = 衣服 + 配饰,需要保证它们配套使用,总不能让手机贴膜绑定服饰区吧?那也太离谱了,堪比让前端写后端代码,跨行了属于是。

核心定义

造个 “超级工厂”,专门生产产品族,一次造一组相关产品,保证配套不翻车,核心是 “造一组,不是造一个”✅,堪比代码界的 “产业链”,造手机的同时连贴膜一起造,一站式配齐。

关键概念(人话版 + 程序员梗)

  • 产品族:同一工厂造的 “全家桶”,比如手机工厂造的「手机 + 贴膜」,相当于一个项目组做一个完整的项目,不拆东墙补西墙;
  • 产品等级:不同全家桶的同类型产品,比如「手机、衣服」都属于 “主商品”,「贴膜、配饰」都属于 “配套商品”,相当于公司的不同部门,产品部和运营部,各司其职但又相互配合。

实战代码(电商商品全家桶版)



// -------------- 定义产品等级接口:主商品/配套商品,代码界的部门划分 --------------// 主商品接口:手机、衣服这些核心款,相当于项目的核心功能public interface IMainGoods {    void putOnShelf(); // 主商品单独上架}// 配套商品接口:贴膜、配饰这些附属款,要绑定主商品上架,相当于项目的辅助功能public interface IAccessoryGoods {    void bindShelf(); // 绑定主商品专区,同步上架,别跨界}// -------------- 具体产品类:产品族+产品等级,配套造,拒绝单打独斗 --------------// 手机产品族:手机本体(主商品)+手机贴膜(配套),一站式配齐public class PhoneMainGoods implements IMainGoods {    @Override    public void putOnShelf() { System.out.println("手机本体上架数码主区~核心功能上线,没BUG!"); }}public class PhoneAccessoryGoods implements IAccessoryGoods {    @Override    public void bindShelf() { System.out.println("手机贴膜绑定数码区,跟手机一起上架~辅助功能不拖后腿"); }}// 服饰产品族:衣服本体(主商品)+衣服配饰(配套),主打一个配套精致public class ClothMainGoods implements IMainGoods {    @Override    public void putOnShelf() { System.out.println("衣服本体上架服饰主区~核心功能稳的一批"); }}public class ClothAccessoryGoods implements IAccessoryGoods {    @Override    public void bindShelf() { System.out.println("衣服配饰绑定服饰区,跟衣服一起上架~配套功能绝绝子"); }}// -------------- 抽象工厂接口:造产品族的规矩,一次造一组,代码界的项目组准则 --------------public interface IGoodsFamilyFactory {    IMainGoods createMainGoods(); // 造主商品,核心功能    IAccessoryGoods createAccessoryGoods(); // 造配套商品,辅助功能}// -------------- 超级工厂1:手机产品族工厂,造手机全家桶,架构师级别的操作 --------------public class PhoneFamilyFactory implements IGoodsFamilyFactory {    @Override    public IMainGoods createMainGoods() { return new PhoneMainGoods(); }    @Override    public IAccessoryGoods createAccessoryGoods() { return new PhoneAccessoryGoods(); }}// -------------- 超级工厂2:服饰产品族工厂,造服饰全家桶,专业的超级工厂 --------------public class ClothFamilyFactory implements IGoodsFamilyFactory {    @Override    public IMainGoods createMainGoods() { return new ClothMainGoods(); }    @Override    public IAccessoryGoods createAccessoryGoods() { return new ClothAccessoryGoods(); }}// -------------- 客户端调用:一键造全家桶,配套上架不翻车,主打一个高效 --------------public class AbstractFactoryTest {    public static void main(String[] args) {        // 造手机全家桶,同步上架,项目一次性上线,不用分批改需求        IGoodsFamilyFactory phoneFactory = new PhoneFamilyFactory();        phoneFactory.createMainGoods().putOnShelf();        phoneFactory.createAccessoryGoods().bindShelf();        System.out.println("------ 我是分割线,别串味 ------");        // 造服饰全家桶,同步上架,拒绝跨部门甩锅        IGoodsFamilyFactory clothFactory = new ClothFamilyFactory();        clothFactory.createMainGoods().putOnShelf();        clothFactory.createAccessoryGoods().bindShelf();    }}

优缺点大吐槽

✅ 优点:从根上避免 “配套产品上错区” 的低级错误❌,保证产品族配套使用,堪比让后端别写前端代码,从源头避免 BUG;新增产品族只需加个超级工厂,符合开闭原则,大型电商 / 平台必用,架构师面试必问;

❌ 缺点:新增产品等级(比如给所有产品族加 “售后服务”),得改所有工厂代码,相当于给所有部门加新 KPI,全公司都得忙,贼麻烦,程序员看了都想跑路。

六、灵魂拷问:3 种工厂模式咋选?(按场景选,不瞎用,拒绝过度设计)

别死记硬背,按业务复杂度选,主打一个 “合适就好,不搞过度设计”,毕竟程序员的时间,要么用来写优雅的代码,要么用来摸鱼,别浪费在无意义的设计上,用电商场景 + 程序员段位总结,一看就懂:

  1. 简单工厂:小商铺、产品少(3 种内)、无专属逻辑,快速开发首选,青铜选手 / CV 工程师直接冲,早写完早摸鱼;
  2. 工厂方法:综合电商、产品多、各产品有专属创建逻辑,追求解耦,黄金 / 铂金选手必备,日常开发用得最多,面试高频考点;
  3. 抽象工厂:大型电商平台、有明确产品族(主商品 + 配套),需要配套上架,王者选手 / 架构师专属,大厂项目必备,炫技必备。

七、终极总结:工厂模式就一句话,别搞复杂!

所有工厂模式的核心就一个:把对象的创建和使用拆开,让代码别粘在一起,后期改需求不头大!

它不是啥高大上的八股文,而是程序员总结的 “偷懒技巧”,学会了让你少写重复代码,少加班,少当面向 BUG 编程的冤种!

不用死记硬背,跟着场景用,用多了自然就会了,毕竟咱程序员的终极宗旨是:能让代码干活,就别自己手动干;能写优雅的代码,就别写祖传的烂代码

关注我后续继续唠设计模式的趣味玩法,从原理到源码,全是人话版 + 程序员专属梗,让你告别八股文,轻松吃透 Java 架构核心,面试不慌,工作摸鱼两不误!

💻 配套实训环境与动手练习

本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验:

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有