5、跟学23种设计模式(C++版):原型模式

原型模式(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++中,通过克隆方法和智能指针的结合,可以有效地实现这一模式。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: