定场诗

“兵无常势,水无常形,能因敌变化而取胜者,谓之神。”

在三国的战场上,兵法如棋,布阵如画。曹操的五色棋布阵,不正是今日软件设计中工厂方法模式的绝妙写照吗?让我们从这个神奇的布阵之法,揭开工厂方法模式的神秘面纱。

五色旗分兵布阵,
八门金锁任调遣。
工厂方法创军团,
灵活多变战未然。

五色棋布阵

建安十三年,曹操与马超在渭南相持。马超骁勇善战,曹军屡战不利。一日,曹操独坐帐中,面对沙盘冥思苦想。

“主公,可有良策?”军师荀攸问道。

曹操缓缓抬头,眼中精光闪烁:”我想到了一个阵法,名为’五色棋布阵’。此阵共分五部,以五行相生相克之理布置。”

荀攸好奇道:”请主公明示。”

曹操取出五色棋子,在沙盘上摆布起来:”金、木、水、火、土,五行相生相克。每种颜色的棋子代表一种兵种,可随时变换位置。敌人看到的永远是变化的阵型,却难觉其中玄机。”

荀攸恍然大悟:”妙哉!这五种兵种如同五个工厂,随时可以生产出我们需要的兵力。”

曹操点头:”正是。金主杀伐,木主生发,水主智谋,火主威猛,土主防守。临阵之时,可随机应变,因敌制宜。”

次日,曹操摆下五色棋布阵。马超率军来攻,却见曹军阵型变幻莫测,攻之不得,守之不能,最终大败而归。

工厂方法模式解析

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

曹操的五色棋布阵与工厂方法模式有异曲同工之妙:

  • 五种颜色的棋子相当于五个不同的工厂方法
  • 每种颜色可以产生不同类型的兵种,就像工厂方法可以创建不同的产品
  • 根据战况选择使用哪种颜色的棋子,就像根据需求选择使用哪个工厂方法

让我们用类图来理解工厂方法模式的结构:

曹操的五色棋布阵 - 工厂方法模式 - 图1

代码实现

让我们用 Java 来实现这个五色棋布阵系统:

  1. // 军队单位接口
  2. interface Unit {
  3. void attack();
  4. void defend();
  5. }
  6. // 军队工厂接口
  7. interface ArmyFactory {
  8. Unit createUnit();
  9. }
  10. // 具体军队单位
  11. class Cavalry implements Unit {
  12. public void attack() { System.out.println("骑兵发起冲锋!"); }
  13. public void defend() { System.out.println("骑兵列阵防守!"); }
  14. }
  15. class Archer implements Unit {
  16. public void attack() { System.out.println("弓箭手放箭!"); }
  17. public void defend() { System.out.println("弓箭手设防!"); }
  18. }
  19. class Scout implements Unit {
  20. public void attack() { System.out.println("斥候发动偷袭!"); }
  21. public void defend() { System.out.println("斥候隐蔽!"); }
  22. }
  23. class Infantry implements Unit {
  24. public void attack() { System.out.println("步兵发起进攻!"); }
  25. public void defend() { System.out.println("步兵筑起盾墙!"); }
  26. }
  27. class Guardian implements Unit {
  28. public void attack() { System.out.println("守卫进行反击!"); }
  29. public void defend() { System.out.println("守卫加强防御!"); }
  30. }
  31. // 具体军队工厂
  32. class GoldArmyFactory implements ArmyFactory {
  33. public Unit createUnit() { return new Cavalry(); }
  34. }
  35. class WoodArmyFactory implements ArmyFactory {
  36. public Unit createUnit() { return new Archer(); }
  37. }
  38. class WaterArmyFactory implements ArmyFactory {
  39. public Unit createUnit() { return new Scout(); }
  40. }
  41. class FireArmyFactory implements ArmyFactory {
  42. public Unit createUnit() { return new Infantry(); }
  43. }
  44. class EarthArmyFactory implements ArmyFactory {
  45. public Unit createUnit() { return new Guardian(); }
  46. }
  47. // 曹操的五色棋布阵
  48. class FiveColorChessFormation {
  49. private ArmyFactory[] factories;
  50. public FiveColorChessFormation() {
  51. factories = new ArmyFactory[] {
  52. new GoldArmyFactory(),
  53. new WoodArmyFactory(),
  54. new WaterArmyFactory(),
  55. new FireArmyFactory(),
  56. new EarthArmyFactory()
  57. };
  58. }
  59. public void deployTroops() {
  60. System.out.println("曹操:部署五色棋布阵!");
  61. for (ArmyFactory factory : factories) {
  62. Unit unit = factory.createUnit();
  63. unit.attack();
  64. unit.defend();
  65. }
  66. }
  67. }
  68. // 主类
  69. public class FactoryMethodPatternDemo {
  70. public static void main(String[] args) {
  71. FiveColorChessFormation caoCaoFormation = new FiveColorChessFormation();
  72. caoCaoFormation.deployTroops();
  73. }
  74. }

运行结果

  1. 曹操:部署五色棋布阵!
  2. 骑兵发起冲锋!
  3. 骑兵列阵防守!
  4. 弓箭手放箭!
  5. 弓箭手设防!
  6. 斥候发动偷袭!
  7. 斥候隐蔽!
  8. 步兵发起进攻!
  9. 步兵筑起盾墙!
  10. 守卫进行反击!
  11. 守卫加强防御!

工厂方法模式的妙用

通过曹操的五色棋布阵,我们可以看到工厂方法模式的几个关键优点:

  1. 灵活性:可以根据战况需要,灵活地创建不同类型的军队单位。
  2. 可扩展性:如果需要新增兵种,只需添加新的具体工厂和具体产品类,无需修改现有代码。
  3. 解耦:具体的军队单位创建逻辑与使用逻辑分离,提高了代码的可维护性。
  4. 遵循开闭原则:可以引入新的军队单位类型,而无需修改现有的代码。

结语

曹操的五色棋布阵不仅展现了其高超的军事才能,也为我们揭示了工厂方法模式的精髓。在软件开发中,工厂方法模式被广泛应用于框架设计、插件系统、可配置应用程序等多个领域。

正如曹操能够根据战况灵活调度不同兵种,我们的软件系统也能够通过工厂方法模式实现对象创建的灵活性和可扩展性。掌握这种设计模式,我们就能在软件架构的战场上,以不变应万变,立于不败之地。