当前位置: 首页 > news >正文

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

定场诗

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

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

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

五色棋布阵

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

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

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

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

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

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

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

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

工厂方法模式解析

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

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

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

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

image-20240707223228199

代码实现

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

// 军队单位接口
interface Unit {void attack();void defend();
}// 军队工厂接口
interface ArmyFactory {Unit createUnit();
}// 具体军队单位
class Cavalry implements Unit {public void attack() { System.out.println("骑兵发起冲锋!"); }public void defend() { System.out.println("骑兵列阵防守!"); }
}class Archer implements Unit {public void attack() { System.out.println("弓箭手放箭!"); }public void defend() { System.out.println("弓箭手设防!"); }
}class Scout implements Unit {public void attack() { System.out.println("斥候发动偷袭!"); }public void defend() { System.out.println("斥候隐蔽!"); }
}class Infantry implements Unit {public void attack() { System.out.println("步兵发起进攻!"); }public void defend() { System.out.println("步兵筑起盾墙!"); }
}class Guardian implements Unit {public void attack() { System.out.println("守卫进行反击!"); }public void defend() { System.out.println("守卫加强防御!"); }
}// 具体军队工厂
class GoldArmyFactory implements ArmyFactory {public Unit createUnit() { return new Cavalry(); }
}class WoodArmyFactory implements ArmyFactory {public Unit createUnit() { return new Archer(); }
}class WaterArmyFactory implements ArmyFactory {public Unit createUnit() { return new Scout(); }
}class FireArmyFactory implements ArmyFactory {public Unit createUnit() { return new Infantry(); }
}class EarthArmyFactory implements ArmyFactory {public Unit createUnit() { return new Guardian(); }
}// 曹操的五色棋布阵
class FiveColorChessFormation {private ArmyFactory[] factories;public FiveColorChessFormation() {factories = new ArmyFactory[] {new GoldArmyFactory(),new WoodArmyFactory(),new WaterArmyFactory(),new FireArmyFactory(),new EarthArmyFactory()};}public void deployTroops() {System.out.println("曹操:部署五色棋布阵!");for (ArmyFactory factory : factories) {Unit unit = factory.createUnit();unit.attack();unit.defend();}}
}// 主类
public class FactoryMethodPatternDemo {public static void main(String[] args) {FiveColorChessFormation caoCaoFormation = new FiveColorChessFormation();caoCaoFormation.deployTroops();}
}

运行结果

曹操:部署五色棋布阵!
骑兵发起冲锋!
骑兵列阵防守!
弓箭手放箭!
弓箭手设防!
斥候发动偷袭!
斥候隐蔽!
步兵发起进攻!
步兵筑起盾墙!
守卫进行反击!
守卫加强防御!

工厂方法模式的妙用

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

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

结语

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

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

参考原文:https://offernow.cn
AI学习助手:https://aistar.cool

相关文章:

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

定场诗 “兵无常势,水无常形,能因敌变化而取胜者,谓之神。” 在三国的战场上,兵法如棋,布阵如画。曹操的五色棋布阵,不正是今日软件设计中工厂方法模式的绝妙写照吗?让我们从这个神奇的布阵之…...

谷粒商城学习笔记-逆向工程错误记录

文章目录 1,Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中,新增如下配置:1.2,执行clean命令刷新maven配置 2,internal java compiler error3,启动逆向工程报错&#x…...

FastAPI+SQLAlchemy数据库连接

FastAPISQLAlchemy数据库连接 目录 FastAPISQLAlchemy数据库连接配置数据库连接创建表模型创建alembic迁移文件安装初始化编辑env.py编辑alembic.ini迁移数据库 视图函数查询 配置数据库连接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…...

Android中的适配器,你知道是做什么的吗?

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD,日常还会涉及Android开发工作。 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起…...

GitHub详解:代码托管与协作开发平台

文章目录 一、GitHub简介二、GitHub的核心功能2.1 仓库(Repository)2.2 版本控制与分支(Branch)2.3 Pull Request2.4 Issues与Projects2.5 GitHub Actions 三、GitHub的使用方法3.1 注册与登录3.2 创建和管理仓库3.3 使用Git进行代…...

【植物大战僵尸杂交版】获取+存档插件

文章目录 一、还记得《植物大战僵尸》吗?二、在哪下载,怎么安装?三、杂交版如何进行存档功能概述 一、还记得《植物大战僵尸》吗? 最近,一款曾经在15年前风靡一时的经典游戏《植物大战僵尸》似乎迎来了它的"文艺复…...

BP神经网络与反向传播算法在深度学习中的应用

BP神经网络与反向传播算法在深度学习中的应用 在神经网络的发展历史中,BP神经网络(Backpropagation Neural Network)占有重要地位。BP神经网络通过反向传播算法进行训练,这种算法在神经网络中引入了一种高效的学习方式。随着深度…...

【数据结构与算法】插入排序

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​...

MySQL如何实现数据排序

根据explain的执行计划来看,MySQL可以分为索引排序和filesort 索引排序 如果查询中的order by字句包含的字段已经在索引中,且索引的排列顺序和order by子句一致,则可直接利用索引进行排序,由于索引有序,所以排序效率…...

给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 Prometheus Grafana,嘿你别说 这俩兄弟配合的相当完美,Prometheus负责数据采集&…...

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色…...

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入:nums [1,2,3],…...

Facebook应用开发:认证与授权登录流程详解

Facebook作为全球最大的社交平台之一,提供了强大的认证与授权机制,允许第三方应用通过Facebook登录来简化用户的注册和登录流程。本文将详细介绍Facebook应用开发中的认证和授权登录流程,以及如何在应用中实现这一功能。 关键词 Facebook登…...

实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)

目录 文章目录 目录docusaurus简介效果专题链接👏环境源码1、安装基础环境2、拉取代码3、安装坚果云并同步md核心文件4、构建运行5、配置脚本环境1.配置vscode终端到ecs的免密2.配置win10 vscode终端环境变量 6、构建并推送静态文件到ecs关于我最后最后 docusaurus简…...

Java教程之IO模式精讲,NIO+BIO

第一章 BIO、NIO、AIO介绍 背景 在java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或 者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说&#x…...

如何让代码兼容 Python 2 和 Python 3?Future 库助你一臂之力

目录 01Future 是什么? 为什么选择 Future? 安装与配置 02Future 的基本用法 1、兼容 print 函数 2、兼容整数除法 3、兼容 Unicode 字符串 03Future 的高级功能 1. 处理字符串与字节 2. 统一异常处理…...

AI让大龄程序员重新焕发活力

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业…...

Python在现代办公自动化中的应用:会不会被裁?就看你的效率了!

Python在现代办公自动化中的应用:提升效率的艺术 Python,作为一门简洁而强大的编程语言,已经成为许多办公室英雄优化日常工作的秘密武器。本文将带你探索Python如何在办公自动化领域大放异彩,并且会巧妙融入开源神器PlugLink&…...

Laravel5+mycat 报错 “Packets out of order”

背景 近期对负责项目,配置了一套 主从复制的 MySQL 集群 使用了中间件 mycat 但测试发现,替换了原来的数据连接后,会出现 Packets out of order 的报错 同时注意到,有的框架代码中竟然也会失效,比如 controller 类中&…...

使用androidx.appcompat:appcompat:1.7.0无法运行的问题

问题: 使用 implementation ‘androidx.appcompat:appcompat:1.7.0’ 出现无法运行的问题,编译都没有问题 AGPBI: {“kind”:“error”,“text”:“java.lang.NullPointerException”,“sources”:[{“file”:“C:\Users\10557\.gradle\caches\transfor…...

Cobra嵌入式VAD引擎:MCU端语音活动检测实战指南

1. Cobra嵌入式语音活动检测引擎技术解析1.1 工程定位与核心价值Cobra 是由 Picovoice 开发的轻量级、高精度语音活动检测(Voice Activity Detection, VAD)引擎,专为资源受限的微控制器(MCU)平台设计。其核心工程目标并…...

从工业5.0到实战:一个智能仓库管理系统的设计与Flutter优化

引言 工业5.0并非对工业4.0的颠覆,而是一次“人性的回归”与“价值的重塑”。它强调以人为本(Human-centric)、可持续(Sustainable)与韧性(Resilient)。作为一名计算机专业的毕业生,…...

OpenClaw学习助手:Qwen3.5-9B驱动的知识整理与习题生成

OpenClaw学习助手:Qwen3.5-9B驱动的知识整理与习题生成 1. 为什么需要AI学习助手? 去年备考PMP认证时,我每天要处理上百页PDF讲义。最痛苦的不是阅读,而是如何把关键知识点转化成可记忆的卡片和练习题。手动整理不仅耗时&#x…...

手把手教你用Vivado仿真FPGA乘法器:从Testbench编写到波形调试全流程指南

FPGA乘法器仿真实战:Vivado Testbench编写与波形调试全解析 第一次接触FPGA乘法器仿真时,我盯着屏幕上那些跳动的波形线,完全不知道它们在传达什么信息。直到后来通过反复实践,才真正理解如何通过仿真验证一个乘法器模块的正确性。…...

MATLAB 实现轴承振动信号模拟:从动力学方程到故障仿真

MATLAB matlab 轴承振动信号模拟 轴承动力学方程 滚动轴承动力学模型,轴承动力学模型:滚动轴承运动学模型,深沟球轴承故障基于Hertz接触理论,采用龙格库塔方法可根据需求仿真轴承正常状态,外圈、内圈以及滚动体的故障…...

COMSOL 流固共轭传热拓扑优化:解锁高效液冷流道设计

COMSOL流固共轭传热拓扑优化 流固共轭传热为同时包含传导、对流的流热耦合场问题,流固共轭传热的拓扑优化技术通常应用于复杂液冷流道的设计,常见于微通道散热器的设计 使用COMSOL软件搭建拓扑优化流程,实现流道流阻小,换热量大等…...

别再手动查日志了!用Skywalking 9.x快速定位Spring Boot微服务性能瓶颈

别再手动查日志了!用Skywalking 9.x快速定位Spring Boot微服务性能瓶颈 微服务架构下最令人头疼的场景莫过于:凌晨三点收到告警,某个核心接口响应时间从200ms飙升到5秒,而你面对几十个相互调用的服务和海量日志,完全不…...

短视频 SEO 关键词优化有哪些注意事项

短视频 SEO 关键词优化有哪些注意事项 在当今数字化时代,短视频平台已经成为了信息传播和内容分享的重要渠道。无论你是个人创作者还是品牌运营者,短视频的流量和曝光度都是关键。在这个竞争激烈的环境中,如何有效地进行短视频 SEO 关键词优…...

新手零压力入门:基于快马平台的ubuntu22.04图文安装实战指南

最近在帮几个朋友入门Linux系统时,发现Ubuntu安装这个看似简单的第一步,对新手来说却充满各种"坑"。从制作启动盘到分区设置,每个环节都可能让初学者手足无措。好在发现了InsCode(快马)平台,它能将复杂的安装过程转化为…...

六通道HDMI/网络/文件混用一体录播机

——H.265硬编、16T存储、8方互动、智能导播,每个通道都能“按需切换” 它到底是什么? WHT-6H是一台6通道全高清录播主机,每个通道都可以在三种信号源之间自由切换: HDMI信号(4路物理接口,最高1080P60&am…...