原型模式(Prototype Pattern)是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,而无需知道如何创建的细节。这个模式通过给出一个原型对象,来表示创建的这些对象的种类,并且通过复制这个原型对象来创建新的对象。
模式特点
- 克隆对象:通过克隆原型对象创建新的对象,而不是通过实例化类。
- 减少子类数量:不需要创建大量的子类来实现不同的对象。
- 动态配置:可以在运行时动态改变需要创建的原型对象。
适用场景
- 类初始化需要消耗非常多的资源:例如需要读取大量的配置信息或进行大量的计算。
- 通过实例化类生成新对象的成本过高:例如需要反复创建大量相似对象。
- 希望动态改变对象的结构或动态创建对象。
C++实例
下面用原型模式创建一个例子,包括Person类及其派生类Student和Teacher。
#include <iostream>
#include <string>
// Product
class Computer {
public:
void setCPU(const std::string& cpu) { CPU = cpu; }
void setGPU(const std::string& gpu) { GPU = gpu; }
void setRAM(const std::string& ram) { RAM = ram; }
void showSpecs() const {
std::cout << "CPU: " << CPU << "\n"
<< "GPU: " << GPU << "\n"
<< "RAM: " << RAM << "\n";
}
private:
std::string CPU;
std::string GPU;
std::string RAM;
};
// Builder Interface
class ComputerBuilder {
public:
virtual void buildCPU() = 0;
virtual void buildGPU() = 0;
virtual void buildRAM() = 0;
virtual Computer* getComputer() = 0;
};
// Concrete Builder
class GamingComputerBuilder : public ComputerBuilder {
public:
GamingComputerBuilder() { computer = new Computer(); }
void buildCPU() override { computer->setCPU("Intel i9"); }
void buildGPU() override { computer->setGPU("NVIDIA RTX 3080"); }
void buildRAM() override { computer->setRAM("32GB"); }
Computer* getComputer() override { return computer; }
private:
Computer* computer;
};
// Director
class Director {
public:
void setBuilder(ComputerBuilder* builder) { this->builder = builder; }
Computer* construct() {
builder->buildCPU();
builder->buildGPU();
builder->buildRAM();
return builder->getComputer();
}
private:
ComputerBuilder* builder;
};
// Main function
int main() {
Director director;
GamingComputerBuilder builder;
director.setBuilder(&builder);
Computer* gamingComputer = director.construct();
gamingComputer->showSpecs();
delete gamingComputer;
return 0;
}
类关系图
简单介绍
- Person:定义了克隆方法和显示信息的接口,是所有具体原型类的基类。
- Student:继承自Person,实现了克隆和显示信息的方法。
- Teacher:继承自Person,实现了克隆和显示信息的方法。
PrototypeManager
:管理和创建原型对象的类。
## 总结 ##
- 原型模式通过克隆现有的对象来创建新对象,避免了使用new操作符直接实例化对象。它特别适用于创建成本高昂或者需要动态配置的对象。通过使用原型模式,可以简化对象的创建过程,并提高系统的灵活性和可扩展性。在C++中,通过克隆方法和智能指针的结合,可以有效地实现这一模式。
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: