模式特点
用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新对象。原型模式通过克隆已有对象来避免重复初始化。
- 通过克隆而非 new 来创建对象,性能更高
- 不需要知道对象创建的细节
- 可以动态获取对象运行时状态来创建副本
- 需注意深拷贝与浅拷贝的区别
类图
应用场景
- Qt 中 QObject 的 clone 机制
- 配置对象复制:从模板配置派生多个实例
- 游戏中的怪物生成:从原型怪物克隆批量生成
- 撤销/恢复操作:保存对象快照用于回退
- 原型注册表:缓存原型对象,按需克隆
示例代码(C++)
// 抽象原型 class Monster { public: virtual Monster* clone() = 0; virtual ~Monster() = default; std::string name; int hp; int attack; }; // 具体原型 class Goblin : public Monster { public: Goblin(std::string n, int h, int a) { name = n; hp = h; attack = a; } // 深拷贝克隆 Monster* clone() override { return new Goblin(*this); } }; // 使用原型注册表 class MonsterRegistry { std::map<std::string, Monster*> m_prototypes; public: void registerMonster(const std::string& key, Monster* proto) { m_prototypes[key] = proto; } Monster* createMonster(const std::string& key) { return m_prototypes[key]->clone(); } }; MonsterRegistry registry; registry.registerMonster("goblin", new Goblin("哥布林", 100, 15)); Monster* m1 = registry.createMonster("goblin"); // 克隆出新对象