当前位置: 首页 > 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…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...