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

C# 如何用工厂方法模式设计游泳比赛排位系统?

——以灵活排位策略实现为例


一、系统核心设计思想

通过工厂方法模式解耦赛事类型与排位策略,实现以下灵活扩展:

1. 动态创建排位策略

  • PrelimEvent(预赛)→ 生成CircleSeeding(循环排位)
  • TimedFinalEvent(计时决赛)→ 生成StraightSeeding(直接排位)
// 预赛返回循环排位策略 
public override Seeding getSeeding() {return new CircleSeeding(swimmers, numLanes);
}

2. 统一抽象接口

  • 抽象基类Event定义公共接口:
    • isPrelim(), isFinal(), isTimedFinal()标识赛事类型
    • getSeeding()工厂方法由子类实现具体策略

二、排位算法实现差异

策略类型适用赛事核心逻辑
直接排位计时决赛按成绩降序分配泳道,快→慢居中排列
循环排位预赛继承直接排位后,对前3组泳道重新分配

1. 直接排位关键步骤

protected override void seed() {sortUpwards(); // 按成绩升序排序 // 计算分组:保证最后一组至少有3人 int lastHeat = count % numLanes;if(lastHeat < 3) lastHeat = 3; numHeats = (count - lastHeat) / numLanes + 1;
}
  • 优势:确保高水平选手分散在不同组别,避免“死亡之组”。

2. 循环排位优化逻辑

protected override void seed() {base.seed(); // 先执行直接排位if(numHeats >= 2) {int circle = (numHeats >= 3) ? 3 : 2;// 重新分配前几组泳道:快慢交错避免扎堆for(int j=0; j<numLanes; j++) {for(int k=0; k<circle; k++) {swmrs[i].setLane(lanes[j]);swmrs[i++].seatHeat(numHeats - k);}}}
}

三、工厂方法的核心价值

1. 解决三类痛点

  • 动态决策:运行时根据赛事类型选择排位策略(如预赛→循环排位)
  • 扩展性:新增赛事类型(如决赛)只需派生新子类
  • 局部化创建逻辑:将对象创建封装在子类,避免客户端代码冗余

2. 典型应用场景

客户端
EventFactory
TimedFinalEvent
PrelimEvent
StraightSeeding
CircleSeeding
  • 工厂通过配置文件(如500free.txt)自动选择赛事类型
  • 新增策略无需修改已有排位算法

四、实践启示

1. 模式选择时机

  • 当系统需支持多维度变化(赛事类型×排位策略)时,工厂方法比简单工厂更符合开闭原则。

2. 性能优化点

  • 循环排位复用直接排位的基础排序,减少重复计算
  • 通过lanes[j]泳道池化降低对象创建开销

3. 扩展方向

  • 添加FinalEvent类实现决赛专属排位策略
  • 支持动态泳道数(如8道池vs10道池)

关键总结:工厂方法模式将“对象创建”提升为系统设计维度,通过抽象与实现的分离,让算法策略像乐高积木般自由组合——这正是应对体育赛事复杂规则演进的终极武器。

http://www.dtcms.com/a/351376.html

相关文章:

  • 机器学习(二)特征工程
  • 机器学习-支持向量机
  • 【Java SE】深入理解异常处理机制
  • Spring AI 入门指南:三步将AI集成到Spring Boot应用
  • 开发避坑指南(38):DOM4J解析XML文件报错“前言中不允许有内容”的解决方案
  • WPF TabControl页面绑定ItemsSource
  • F006 vue+flask python 垃圾分类可视化系统+爬虫
  • 力扣(逆波兰表达式求值)
  • 英伟达 Spectrum-XGS:重构 AI 基础设施,开启跨域超级工厂时代
  • Day3--HOT100--42. 接雨水,3. 无重复字符的最长子串,438. 找到字符串中所有字母异位词
  • JHipster 生成器快速入门
  • 爬虫 API:从技术架构到实战落地的全维度解析
  • 功能强大的PDF工具箱-- PDF补丁丁,v1.1.0.4657新版本,免费无广告,开箱即用版~
  • HarmonyOS 中 @Observed 与 @ObjectLink:对象级别的响应式数据管理
  • 鸿蒙中使用极光推送
  • 阿里云docker搭建的mysql无法访问
  • 如何下载MySQL小白指南 (以 Windows 为例)
  • CNN 中 3×3 卷积核等设计背后的底层逻辑
  • 负载均衡之带权重的随机负载均衡算法详解与实现
  • 【LeetCode】动态规划——198.打家劫舍、213.打家劫舍||、337.打家劫舍|||
  • 开发避坑指南(37):Vue3 标签页实现攻略
  • 【Python系列】Flask 和 FastAPI对比
  • 高性价比的云手机该怎样进行选择?
  • GraphRAG——v0.3.5版本
  • 从MySQL到OpenTenBase:电商平台分布式数据库架构升级实战
  • TCP协议11种状态
  • 【人工智能AI、机器学习ML、深度学习DL、基础模型FM、LLM、GPT、Generative AI 分别是什么?他们之间的关系是什么?】
  • 一个头像图片滚动轮播组件(React实现)
  • vscode有的结构体不能补全,有的可以补全问题的解决.
  • 校园资讯平台|校园资讯平台系统|基于java和小程序的校园资讯平台设计与实现(源码+数据库+文档)