BK-CI 项目设计模式实践指南,涵盖工厂模式、策略模式、观察者模式、装饰器模式、模板方法等在项目中的实际应用。当用户学习设计模式、重构代码、设计可扩展架构或理解项目设计时使用。
View on GitHubJanuary 24, 2026
Select agents to install to:
npx add-skill https://github.com/TencentBlueKing/bk-ci/blob/10973233baf7f2bd934986633bb59d4ed4f6503a/ai/skills/design-patterns/SKILL.md -a claude-code --skill design-patternsInstallation paths:
.claude/skills/design-patterns/# Skill 27: BK-CI 项目设计模式实践指南
## 概述
本指南总结了 BK-CI 项目中广泛使用的设计模式及其实际应用场景,帮助开发者理解项目架构并遵循统一的设计模式规范。
---
## 1. 工厂模式(Factory Pattern)
### 1.1 简单工厂(Simple Factory)
**应用场景**:创建特定类型的对象,通过类型参数决定实例化哪个类。
**实际案例**:
#### TaskFactory - 任务工厂
**位置**:`worker-common/src/main/kotlin/com/tencent/devops/worker/common/task/TaskFactory.kt`
**实现方式**:
```kotlin
object TaskFactory {
private val taskMap = ConcurrentHashMap<String, KClass<out ITask>>()
fun init() {
// 注册内置任务
register(LinuxScriptElement.classType, LinuxScriptTask::class)
register(WindowsScriptElement.classType, WindowsScriptTask::class)
register(MarketBuildAtomElement.classType, MarketAtomTask::class)
// 通过反射扫描并注册插件任务
val reflections = Reflections("com.tencent.devops.plugin.worker.task")
val taskClasses = reflections.getSubTypesOf(ITask::class.java)
taskClasses?.forEach { taskClazz ->
val taskClassType = taskClazz.getAnnotation(TaskClassType::class.java)
taskClassType?.classTypes?.forEach { classType ->
register(classType, taskClazz.kotlin)
}
}
}
fun create(type: String): ITask {
val clazz = taskMap[type] ?: return EmptyTask(type)
return clazz.primaryConstructor?.call() ?: EmptyTask(type)
}
}
```
**使用方式**:
```kotlin
// 根据 element 类型创建对应的任务实例
val task = TaskFactory.create(element.getClassType())
task.run(buildTask, param, elementId)
```
**特点**:
- 使用 Kotlin `object` 实现单例
- 支持反射扫描自动注册
- 支持优先级覆盖(`priority` 字段)
- 使用 `ConcurrentHashMap` 保证线程安全
---
#### ScmFactory - 代码库工厂
**位置**:`common-scm/src/main/kotlin/com/tencent/devops/scm/ScmFactory.kt`
**实现方式**:
```kotlin
object ScmFactory {
private val gitApi = GitApi()
private val svnApi = SVNApi()
fun getScm(
projectName: String,
url: String,
type: ScmType, // CODE_SVN, CODE_GIT, CODE_TGIT, CODE_GITLAB, CODE_P4
// ... 其他参数
): IScm {
return when (type) {