原型模式(Prototype)
原型模式是一种创建型设计模式,它允许通过复制现有的对象来创建新对象,而不是通过创建新的实例。原型模式主要用于那些创建成本较高或复杂的对象,可以通过复制现有对象来节省时间和资源。
1. 原型模式的结构
原型模式包含以下几个主要组件:
- Prototype(原型): 声明了复制自身的方法。
- ConcretePrototype(具体原型): 实现了
Prototype
接口,并定义了复制自身的方法。 - Client(客户端): 使用原型实例来创建新的对象,通常通过调用
clone
方法。
2. Mermaid 关系图
以下是原型模式的类图,用 Mermaid 表示:
classDiagram class Prototype { <<abstract>> + clone() : Prototype } class ConcretePrototypeA { + clone() : Prototype } class ConcretePrototypeB { + clone() : Prototype } class Client { + someOperation(p : Prototype) : void } Prototype <|-- ConcretePrototypeA Prototype <|-- ConcretePrototypeB Client --> Prototype : "克隆"
3. 原型模式的实现
Prototype 抽象原型类:
class Prototype {
public:
virtual ~Prototype() = default;
virtual Prototype* clone() const = 0;
};
ConcretePrototypeA 具体原型A类:
class ConcretePrototypeA : public Prototype {
public:
ConcretePrototypeA() {
// 初始化代码
}
Prototype* clone() const override {
return new ConcretePrototypeA(*this);
}
// 其他成员函数
};
ConcretePrototypeB 具体原型B类:
class ConcretePrototypeB : public Prototype {
public:
ConcretePrototypeB() {
// 初始化代码
}
Prototype* clone() const override {
return new ConcretePrototypeB(*this);
}
// 其他成员函数
};
Client 客户端代码:
void ClientCode(const Prototype& prototype) {
Prototype* clone = prototype.clone();
// 使用克隆对象
delete clone;
}
int main() {
ConcretePrototypeA prototypeA;
ClientCode(prototypeA);
ConcretePrototypeB prototypeB;
ClientCode(prototypeB);
return 0;
}
4. 使用原型模式
在客户端代码中,通过调用 clone
方法创建新对象而不是直接实例化对象。这样可以在运行时动态地创建对象,并且避免了对象创建的复杂性和开销。
5. 总结
原型模式通过克隆现有对象来创建新对象,适用于对象创建成本较高的场景。Mermaid 类图展示了原型模式中的原型、具体原型以及客户端之间的关系,帮助理解模式的结构和实现。