原型模式(Prototype Pattern)是一种创建型设计模式,允许你通过复制现有对象来创建新的对象,而不是从头开始构建。这种模式主要通过提供一个用于复制对象的接口,定义生成对象的类型,并通过实例化对象的原型来复制它们,来实现对象的快速创建。
核心思想:原型模式的核心思想是克隆现有的对象。通过克隆方法,而不是直接用 new 创建对象,可以动态地调整新对象的初始状态,也有助于提高创建对象的效率。
组成部分
-
原型接口(Prototype):定义一个用于克隆自身的接口。
-
具体原型(ConcretePrototype):实现一个克隆方法,该方法通过复制已有的实例来返回一个新的对象。通常使用
clone()方法。 -
客户端(Client):客户端通过调用克隆方法来请求新的对象。这消除了直接依赖于具体对象类的需求。
简单示例:以下是一个在 C++ 中实现原型模式的简单示例:
#include <iostream>
#include <memory>
#include <string>
#include <unordered_map>
// 原型接口,定义 clone 方法
class Prototype {
public:
virtual ~Prototype() = default;
virtual std::unique_ptr<Prototype> clone() const = 0;
virtual void print() const = 0;
};
// 具体原型类
class ConcretePrototype1 : public Prototype {
public:
ConcretePrototype1(const std::string& name) : name_(name) {}
std::unique_ptr<Prototype> clone() const override {
return std::make_unique<ConcretePrototype1>(*this);
}
void print() const override {
std::cout << "ConcretePrototype1: " << name_ << std::endl;
}
private:
std::string name_;
};
// 另一个具体原型类
class ConcretePrototype2 : public Prototype {
public:
ConcretePrototype2(int value) : value_(value) {}
std::unique_ptr<Prototype> clone() const override {
return std::make_unique<ConcretePrototype2>(*this);
}
void print() const override {
std::cout << "ConcretePrototype2: " << value_ << std::endl;
}
private:
int value_;
};
// 客户端代码
int main() {
std::unordered_map<std::string, std::unique_ptr<Prototype>> prototypes;
prototypes["Type1"] = std::make_unique<ConcretePrototype1>("Prototype 1");
prototypes["Type2"] = std::make_unique<ConcretePrototype2>(42);
auto prototype1 = prototypes["Type1"]->clone();
prototype1->print();
auto prototype2 = prototypes["Type2"]->clone();
prototype2->print();
return 0;
}
特点和优点
-
快速创建实例:复制已有对象要比使用构造函数创建新对象更高效,尤其是在对象初始化需要较多复杂操作时。
-
动态对象创建:原型模式允许动态调整对象的状态,而不依赖于编译时的类信息。
-
减少对具体类的依赖:客户端无需知道对象的具体类结构,减少类间依赖,提高代码的灵活性和可扩展性。
使用场景
-
成本高的对象创建:当直接使用构造函数创建对象的代价较高时,通过克隆比较直接创建更为高效。
-
对象变化小:在对象的相似性很高,仅需少许调整来实现不同功能的场景,如数据缓存。
-
减少子类组合:使用原型模式克隆出不同对象,相比创建复杂的类层次,更为简洁有效。
原型模式使用对象克隆技术,提供了更为灵活的对象创建方式,特别适用于需要创建多个相似对象的场合。使用原型模式可减少代码冗余,同时提高动态扩展的弹性。

被折叠的 条评论
为什么被折叠?



