Lua 语言实现的经典设计模式与游戏开发常用框架模式集合。每个模式均包含可运行的示例代码,适合学习和在游戏项目中直接引用。
- Lua 5.1+ / LuaJIT 2.0+
- 无外部依赖,所有代码均可独立运行
按照设计模式的功能划分为八大类,共 23 种经典模式:
| 模式 |
路径 |
说明 |
| 单例模式 (Singleton) |
DesignPattern/Singleton |
保证类只有一个实例,提供全局访问点 |
| 原型模式 (Prototype) |
DesignPattern/Prototype |
通过克隆原型创建新对象,提供云风式 Lua OOP class 实现 |
| 工厂模式 (Factory) |
DesignPattern/Factory |
定义创建对象的接口,由子类决定实例化哪个类 |
| 抽象工厂模式 (AbstractFactory) |
DesignPattern/AbstractFactory |
创建一系列相关/依赖对象的接口(Apple/Huawei 产品族示例) |
| 建造者模式 (Builder) |
DesignPattern/Builder |
将复杂对象的构建与表示分离 |
| 模式 |
路径 |
说明 |
| 适配器模式 (Adapter) |
DesignPattern/Adapter |
将一个接口转换成客户期望的另一个接口 |
| 桥接模式 (Bridge) |
DesignPattern/Bridge |
将抽象与实现分离,使两者可以独立变化(颜色与形状示例) |
| 外观模式 (Facade) |
DesignPattern/Facade |
为子系统提供统一的高层接口 |
| 模式 |
路径 |
说明 |
| 中介者模式 (Mediator) |
DesignPattern/Mediator |
用中介对象封装一系列对象交互 |
| 观察者模式 (Observer) |
DesignPattern/Observer |
定义对象间一对多依赖关系,状态变化时自动通知 |
| 模式 |
路径 |
说明 |
| 组合模式 (Composite) |
DesignPattern/Composite |
将对象组合成树形结构表示"部分-整体"层次 |
| 迭代器模式 (Iterator) |
DesignPattern/Iterator |
提供顺序访问聚合对象中元素的方法,不暴露内部表示 |
| 模式 |
路径 |
说明 |
| 装饰器模式 (Decorator) |
DesignPattern/Decorator |
动态给对象添加额外职责,比继承更灵活 |
| 责任链模式 (ChainOfResponsibility) |
DesignPattern/ChainOfResponsibility |
使多个对象有机会处理请求,避免发送者和接收者耦合 |
| 访问者模式 (Visitor) |
DesignPattern/Visitor |
在不改变类的前提下定义作用于元素的新操作(表达式求值示例) |
| 模式 |
路径 |
说明 |
| 模板方法模式 (Template) |
DesignPattern/Template |
定义算法骨架,将步骤延迟到子类实现(UI 生命周期示例) |
| 策略模式 (Strategy) |
DesignPattern/Strategy |
定义一系列算法,封装起来使它们可互相替换(折扣/满减计价示例) |
| 命令模式 (Command) |
DesignPattern/Command |
将请求封装为对象,支持撤销/重做操作 |
| 解释器模式 (Interpreter) |
DesignPattern/Interpreter |
定义语言文法,建立解释器解释句子(算术表达式解析器示例) |
| 模式 |
路径 |
说明 |
| 状态模式 (State) |
DesignPattern/State |
允许对象在内部状态改变时改变行为(有限状态机示例) |
| 备忘录模式 (Memento) |
DesignPattern/Memento |
在不破坏封装的前提下捕获对象内部状态(存档/读档示例) |
| 模式 |
路径 |
说明 |
| 享元模式 (Flyweight) |
DesignPattern/Flyweight |
运用共享技术有效支持大量细粒度对象(地图树木示例) |
| 代理模式 (Proxy) |
DesignPattern/Proxy |
为其他对象提供代理以控制对这个对象的访问(图片延迟加载示例) |
游戏开发中常用的架构模式,共 9 种:
| 模式 |
路径 |
说明 |
| 有限状态机 (FSM) |
FrameworkPattern/FSM |
基础状态机框架,支持状态切换、进入/更新/离开回调 |
| 行为树 (BehaviorTree) |
FrameworkPattern/BehaviorTree |
游戏 AI 行为树,支持 Sequence/Selector/Action/Condition 节点 |
| 实体组件系统 (ECS) |
FrameworkPattern/ECS |
数据驱动的 Entity-Component-System 架构 |
| 对象池 (ObjectPool) |
FrameworkPattern/ObjectPool |
对象复用池,减少 GC 开销,支持容量上限和预热 |
| 消息分发 (MessageDispatch) |
FrameworkPattern/MessageDispatch |
事件派发器,支持 moduleId+eventId 双层键注册 |
| 消息通知中心 (NotificationCenter) |
FrameworkPattern/MessageDispatch |
基于名称的消息注册/分发/注销 |
| 消息队列 (MessageQueue) |
FrameworkPattern/MessageQueue |
FIFO 消息队列,支持 push/pop/count/isEmpty |
| MVC |
FrameworkPattern/MVC |
Model-View-Controller 基础实现 |
| MVVM |
FrameworkPattern/MVVM |
Model-View-ViewModel,内置数据绑定库(单向/双向绑定) |
| PureMVC |
FrameworkPattern/PureMVC |
经典 PureMVC 简化实现,包含 Facade/Model/View/Controller/Proxy/Mediator/Command |
所有 Lua 文件统一遵循以下编码规范:
- 使用原生 Lua OOP 风格:
setmetatable + __index + .new() 构造函数
- 方法定义使用冒号语法
:,确保 self 正确传递
- 模块级变量使用
local,避免全局污染
- 测试/示例代码包裹在 IIFE(立即执行函数)中
- 模块通过
return 导出,支持 dofile/require 引入
- 缩进使用 4 空格
每个模式文件均可独立运行:
lua DesignPattern/Singleton/Singleton.lua
lua DesignPattern/Observer/Observer.lua
lua DesignPattern/Strategy/Strategy.lua
-- 引入对象池
local ObjectPool = dofile("FrameworkPattern/ObjectPool/ObjectPool.lua")
local pool = ObjectPool.new(
function() return {x = 0, y = 0} end, -- 创建函数
function(obj) obj.x, obj.y = 0, 0 end, -- 重置函数
nil, nil, 100 -- 容量上限 100
)
pool:prewarm(10) -- 预热 10 个对象
local obj = pool:get() -- 获取对象
pool:release(obj) -- 归还对象
pool:clear() -- 清空池
-- 引入 FSM
local FsmMachine, BaseState = dofile("FrameworkPattern/FSM/FSM.lua")
local IdleState = setmetatable({}, {__index = BaseState})
IdleState.__index = IdleState
function IdleState.new()
local o = BaseState.new("Idle")
return setmetatable(o, IdleState)
end
function IdleState:onEnter() print("Enter Idle") end
function IdleState:onLeave() print("Leave Idle") end
function IdleState:onUpdate() print("Update Idle") end
local fsm = FsmMachine.new()
fsm:addState(IdleState.new())
fsm:addInitState(fsm.states.Idle)
fsm:update()
fsm:switch("Move")
-- 引入 MVVM 数据绑定
local MVVM = dofile("FrameworkPattern/MVVM/MVVM.lua")
local model = MVVM.Model.new({hp = 100, name = "Hero"})
local vm = MVVM.ViewModel.new(model)
vm:bindProperty("hp", "hp")
vm:watch("hp", function(newVal, oldVal)
print("HP changed:", oldVal, "->", newVal)
end)
model:set("hp", 80) -- 自动触发 watch 回调
运行所有设计模式示例:
for f in DesignPattern/*/*.lua; do echo "--- $f ---"; lua "$f"; done
运行 ECS 示例:
cd FrameworkPattern/ECS && lua test.lua