Java 设计模式西游篇 - 第二回:工厂模式开宝店 八戒误入创建坑

📅 发布时间:2026/7/5 2:27:23 👁️ 浏览次数:
Java 设计模式西游篇 - 第二回:工厂模式开宝店 八戒误入创建坑
诗曰对象创建花样多直接 new 出祸端。 工厂模式来相助解耦创建保平安。 故事师徒四人来到对象创建国只见城门上写着法宝制造中心。八戒一看乐了“猴哥你看这满街的法宝店老猪我去弄几件趁手的兵器”悟空急忙拦住“呆子莫要乱闯这国的规矩是——不能直接 new 对象得走工厂”八戒不解“为啥俺老猪有钱想买啥买啥”悟空笑道“你且看这国的门道…” 踩坑打怪耦合三魔的围剿第一魔硬编码之妖八戒不信邪冲进一家兵器铺直接 new 了一把九齿钉耙publicclassBajie{privateWeaponweaponnewNineProngedRake();// 直接 newpublicvoidfight(){weapon.attack();}}谁知刚出门就遇到硬编码之妖此妖使出一招需求变更八戒顿时傻眼妖怪吼道“八戒国王有令你现在要用禅杖不用钉耙了”八戒慌了“这…这可咋办”悟空分析“呆子你的武器是硬编码 new 出来的要换武器就得改代码、重新编译”八戒哭道“猴哥救命”第二魔依赖纠缠怪悟空帮八戒改了代码继续前行。谁知又遇依赖纠缠怪publicclassTangSeng{privateWhiteHorsehorsenewWhiteHorse();privateBuddhistRobesrobesnewBuddhistRobes();privateBuddhistHathatnewBuddhistHat();// 以后每加一个依赖就要改这里...publicvoidtravel(){horse.ride();robes.wear();hat.putOn();}}妖怪使招“依赖倒置”唐僧被各种依赖缠住动弹不得悟空分析“师父你这类依赖了太多具体类哪天要换个马就得改你的代码应该依赖抽象而不是具体实现”第三魔扩展封闭兽好不容易脱身又遇扩展封闭兽publicclassWeaponFactory{publicstaticWeaponcreateWeapon(Stringtype){switch(type){casegolden_cudgel:returnnewGoldenCudgel();casenine_pronged_rake:returnnewNineProngedRake();casemonk_staff:returnnewMonkStaff();// 每加一个新武器就要改这里default:thrownewIllegalArgumentException(未知武器);}}}妖怪吼道“新增武器类型”悟空正要加新武器却发现要改工厂代码悟空皱眉“这违反了’开闭原则’应该对扩展开放对修改封闭”⚔️ 工厂模式大法第一式简单工厂一个工厂管所有publicclassWeaponFactory{publicstaticWeaponcreateWeapon(Stringtype){switch(type){casegolden_cudgel:returnnewGoldenCudgel();casenine_pronged_rake:returnnewNineProngedRake();casemonk_staff:returnnewMonkStaff();default:thrownewIllegalArgumentException(未知武器);}}}// 使用WeaponweaponWeaponFactory.createWeapon(golden_cudgel);优点简单客户端不用管创建细节缺点违反开闭原则加新产品要改工厂八戒评价“这还行老猪我只要说’给我个钉耙’工厂就给俺造”第二式工厂方法每个产品一个工厂// 抽象工厂publicinterfaceWeaponFactory{WeaponcreateWeapon();}// 悟空的工厂publicclassWukongWeaponFactoryimplementsWeaponFactory{OverridepublicWeaponcreateWeapon(){returnnewGoldenCudgel();}}// 八戒的工厂publicclassBajieWeaponFactoryimplementsWeaponFactory{OverridepublicWeaponcreateWeapon(){returnnewNineProngedRake();}}// 沙僧的工厂publicclassShaSengWeaponFactoryimplementsWeaponFactory{OverridepublicWeaponcreateWeapon(){returnnewMonkStaff();}}// 使用WeaponFactoryfactorynewWukongWeaponFactory();Weaponweaponfactory.createWeapon();优点符合开闭原则加新产品不用改现有代码缺点每加一个产品就要加一个工厂类悟空点评“这招高明哪天如来佛祖要加个新武器只需新建一个工厂不用动现有的”第三式抽象工厂产品族// 抽象工厂接口publicinterfaceEquipmentFactory{WeaponcreateWeapon();ArmorcreateArmor();MountcreateMount();}// 悟空装备工厂publicclassWukongEquipmentFactoryimplementsEquipmentFactory{OverridepublicWeaponcreateWeapon(){returnnewGoldenCudgel();}OverridepublicArmorcreateArmor(){returnnewPhoenixFeatherCap();}OverridepublicMountcreateMount(){returnnewSomersaultCloud();}}// 八戒装备工厂publicclassBajieEquipmentFactoryimplementsEquipmentFactory{OverridepublicWeaponcreateWeapon(){returnnewNineProngedRake();}OverridepublicArmorcreateArmor(){returnnewIronChainArmor();}OverridepublicMountcreateMount(){returnnewBlackCloud();}}// 使用EquipmentFactoryfactorynewWukongEquipmentFactory();Weaponweaponfactory.createWeapon();Armorarmorfactory.createArmor();Mountmountfactory.createMount();优点可以创建一整套配套的产品缺点加新产品类型要改所有工厂沙僧总结“大师兄的工厂产出’悟空套装’二师兄的工厂产出’八戒套装’各成一系” 战斗总结妖怪攻击方式破解招式硬编码之妖需求变更工厂封装创建逻辑依赖纠缠怪依赖具体类依赖抽象工厂接口扩展封闭兽新增产品类型工厂方法模式本章要点模式类型特点适用场景简单工厂一个工厂管所有产品少逻辑简单工厂方法每个产品一个工厂产品多需要扩展抽象工厂创建产品族需要配套的产品组合八戒的教训八戒不信邪偷偷 new 了一个九齿钉耙结果// 编译报错构造函数是私有的NineProngedRakerakenewNineProngedRake();// ❌悟空笑道“呆子这国的法宝都受工厂管你绕过工厂当然不行”八戒嘟囔“知道了…以后要啥找工厂不自己 new 了…”下回预告话说师徒来到算法变换山遇到白骨精三次变化。每次变化悟空都要换一种打法。如何灵活应对欲知后事如何且听第三回分解