宝子们谁懂啊!写代码最怕啥?硬邦邦的 new 对象堆一堆,后期改需求直接原地爆炸,CV 工程师看了都摇头,祖传代码直接变成 “祖传 BUG”!而工厂模式就是拯救我们的「对象创建神器」,作为设计模式里的 “入门必学款”,学会它,代码解耦、易维护直接拉满,从此告别面向百度编程,做个有追求的程序员!
今天咱不整干巴巴的八股文,用电商商品上架的接地气场景,唠透简单工厂、工厂方法、抽象工厂这 3 种模式,附完整 Java 代码,幽默人话版讲解 + 程序员专属梗,看完直呼 “原来这么简单,之前白头秃了”!
一、先打基础:软件设计七大原则(装 X + 实战都够用,面试还能吹)
所有设计模式的底层逻辑都是这 7 个原则,说白了就是让代码 “好伺候”,别动不动就崩,毕竟程序员的时间,要么用来摸鱼,要么用来解决之前写的烂代码。一句话总结,好记到离谱:
表格

原则 | 人话版核心 | 程序员梗版解读 |
开闭原则 | 加功能随便加,别动我原来的代码♂️ | 新增需求别改老代码,不然 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 种工厂模式咋选?(按场景选,不瞎用,拒绝过度设计)
别死记硬背,按业务复杂度选,主打一个 “合适就好,不搞过度设计”,毕竟程序员的时间,要么用来写优雅的代码,要么用来摸鱼,别浪费在无意义的设计上,用电商场景 + 程序员段位总结,一看就懂:
- 简单工厂:小商铺、产品少(3 种内)、无专属逻辑,快速开发首选,青铜选手 / CV 工程师直接冲,早写完早摸鱼;
- 工厂方法:综合电商、产品多、各产品有专属创建逻辑,追求解耦,黄金 / 铂金选手必备,日常开发用得最多,面试高频考点;
- 抽象工厂:大型电商平台、有明确产品族(主商品 + 配套),需要配套上架,王者选手 / 架构师专属,大厂项目必备,炫技必备。
七、终极总结:工厂模式就一句话,别搞复杂!
所有工厂模式的核心就一个:把对象的创建和使用拆开,让代码别粘在一起,后期改需求不头大!
它不是啥高大上的八股文,而是程序员总结的 “偷懒技巧”,学会了让你少写重复代码,少加班,少当面向 BUG 编程的冤种!
不用死记硬背,跟着场景用,用多了自然就会了,毕竟咱程序员的终极宗旨是:能让代码干活,就别自己手动干;能写优雅的代码,就别写祖传的烂代码
关注我后续继续唠设计模式的趣味玩法,从原理到源码,全是人话版 + 程序员专属梗,让你告别八股文,轻松吃透 Java 架构核心,面试不慌,工作摸鱼两不误!
💻 配套实训环境与动手练习
本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验: