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

定场诗

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

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

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

五色棋布阵

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

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

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

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

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

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

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

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

工厂方法模式解析

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/781910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MSPM0G3507——串口0从数据线传输变为IO口传输

默认的跳线帽时这样的,这样时是数据线传输 需要改成这样,即可用IO口进行数据传输

实验六 图像的傅立叶变换

一.实验目的 1了解图像变换的意义和手段; 2熟悉傅立叶变换的基本性质; 3熟练掌握FFT变换方法及应用; 4通过实验了解二维频谱的分布特点; 5通过本实验掌握利用MATLAB编程实现数字图像的傅立叶变换。 6评价人眼对图…

Mac 系统如何将搜狗输入法设置为默认输入法

Mac 系统默认将自带的ABC输入法作为默认输入法,很不方便中文输入,想设置搜狗输入法为默认输入法如何设置呢?具体步骤如下: 1、打开:系统设置——键盘——文字输入,点击设置 2、点击左下角的 3、选择 其他…

52-5 内网代理2 - LCX端口转发(不推荐使用LCX)

环境搭建: 本地开3台虚拟机:kali(必须)、windows2012与2008 (可换成其他windows虚拟机) kali - 网络配置成桥接模式 windows2012 - 设置两个网卡,NAT与桥接模式 注意:windows2012要关闭防火墙,要不然其他主机ping不通 关闭防火墙后再开启远程桌面连接 windwos20…

Java项目:基于SSM框架实现的德云社票务管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的德云社票务管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…

Python 学习中什么是字典,如何操作字典?

什么是字典 字典(Dictionary)是Python中的一种内置数据结构,用于存储键值对(key-value pair)。字典的特点是通过键来快速查找值,键必须是唯一的,而值可以是任何数据类型。字典在其他编程语言中…

游戏AI的创造思路-技术基础-遗传算法

遗传算法,选对了遗传算子,那就是优秀的继承者,选错了,那就是传说在祸害遗千年~~~~~ 目录 1. 定义 2. 发展历史 3. 遗传算法的基本原理和流程 3.1. 基本原理 3.1.1.基本原理 3.1.2. 算法流程 3.1.3. 关键要素 3.2. 函数和方…

栈和队列---循环队列

1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接…

为什么固定尺寸 AdSense 广告依旧会出现并非指定的尺寸广告?

经常在网站上投放谷歌 AdSense广告的站长应该都碰到过,明明投放的是固定尺寸的广告位里旧会出现并非指定尺寸的AdSense 广告,很诡异的感觉。其实这都是因为你的 AdSense 账号广告优化造成的,其中里面就包含了广告尺寸优化,只需要在…

盘点当下智能体应用开发的几种形态

现在多智能体系统开发的关注度越来越高了,不光在开发者的圈子热度很高,很多职场人士,甚至是小白也参与其中,因为现在的门槛越来越低了,尤其是,最近特别火的扣子(coze)和百度的appbui…

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序: npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成: const {Sequelize} re…

【Java12】封装

封装(Encapsulation)是面向对象的三大特征之一(另两个是继承和多态),指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的…

[护网训练]原创应急响应靶机整理集合

前言 目前已经出了很多应急响应靶机了,有意愿的时间,或者正在准备国护的师傅,可以尝试着做一做已知的应急响应靶机。 关于后期: 后期的应急响应会偏向拓扑化,不再是单单一台机器,也会慢慢完善整体制度。…

《昇思25天学习打卡营第14天|onereal》

第14天学习内容如下: Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c…

Zabbix 配置grafana对接

zabbix对接grafana简介 Zabbix与Grafana对接可以实现更加丰富和美观的数据可视化,可以利用Grafana强大的可视化功能来展示Zabbix收集的数据。 Grafana 本身是提供了Zabbix的对接插件,开箱即用,安装好了之后点击 enable 一下就能启用。然后就…

深度学习中的Channel,通道数是什么?

参考文章: 直观理解深度学习的卷积操作,超赞!-CSDN博客​​​​​​如何理解卷积神经网络中的通道(channel)_神经网络通道数-CSDN博客 深度学习-卷积神经网络—卷积操作详细介绍_深度卷积的作用-CSDN博客 正文&…

护网在即,助力安服仔漏洞扫描~

整合了个漏扫系统,安服仔必备~ 使用场景 网前布防,漏洞扫描,资产梳理 使用方法: 启动虚拟机后运行命令: ./StartSystemScript.sh 输入密码attack 启动完成后浏览器打开网站: http://IP:5000 相关账户…

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户,可以通过Google账户登录,或者可以注册一个Codeium账户(如果没有弹出让你登录账户的界面,可以等安装结束后在右下角找到登录的地方) 右下角显示如下图所示&#…

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成:运行异常与编译异常 两者区别:编译异常用来提醒程序员,运行异常大部分是由于参数传递错误导致 异常作用: 作用1:就是平时的报错,方便我们找到报错的来源 作用2:在方法内部…

计算机网络性能指标概述:速率、带宽、时延等

在计算机网络中,性能指标是衡量网络效率和质量的重要参数。本文将综合三篇关于计算机网络性能指标的文章,详细介绍速率、带宽、吞吐量、时延、时延带宽积、往返时延(RTT) 和利用率的概念及其在网络中的应用。 1. 速率(…