C++中的原型模式

目录

原型模式(Prototype Pattern)

实际应用

克隆形状对象

克隆计算机对象

克隆文档对象

总结


原型模式(Prototype Pattern)

原型模式是一种创建型设计模式,它允许你通过复制现有对象来创建新的对象,而不是通过类实例化来创建对象。这种模式在开发时需要大量类似对象的情况下非常有用。原型模式的核心是一个具有克隆方法的接口,通过实现该接口,不同的对象可以被复制。

实际应用

在C++中,原型模式通常使用一个基类(原型接口)和具体实现类来实现。基类包含一个纯虚拟的克隆方法,每个具体类实现该方法以返回自己的克隆。

克隆形状对象

假设我们有一个`Shape`基类和一些具体的形状类,如`Circle`和`Rectangle`。

#include <iostream>
#include <memory>
#include <unordered_map>

// Shape基类,包含一个纯虚拟的克隆方法
class Shape {
public:
    virtual ~Shape() = default;
    virtual std::unique_ptr<Shape> clone() const = 0;
    virtual void draw() const = 0;
};

// Circle类,继承自Shape并实现克隆方法
class Circle : public Shape {
private:
    int radius;
public:
    Circle(int r) : radius(r) {}
    std::unique_ptr<Shape> clone() const override {
        return std::make_unique<Circle>(*this);
    }
    void draw() const override {
        std::cout << "Drawing a Circle with radius " << radius << "\n";
    }
};

// Rectangle类,继承自Shape并实现克隆方法
class Rectangle : public Shape {
private:
    int width, height;
public:
    Rectangle(int w, int h) : width(w), height(h) {}
    std::unique_ptr<Shape> clone() const override {
        return std::make_unique<Rectangle>(*this);
    }
    void draw() const override {
        std::cout << "Drawing a Rectangle with width " << width << " and height " << height << "\n";
    }
};

int main() {
    // 创建原型对象
    std::unordered_map<std::string, std::unique_ptr<Shape>> prototypes;
    prototypes["circle"] = std::make_unique<Circle>(10);
    prototypes["rectangle"] = std::make_unique<Rectangle>(20, 30);

    // 克隆对象
    std::unique_ptr<Shape> shape1 = prototypes["circle"]->clone();
    std::unique_ptr<Shape> shape2 = prototypes["rectangle"]->clone();

    // 绘制克隆的对象
    shape1->draw();
    shape2->draw();

    return 0;
}

克隆计算机对象

假设我们有一个`Computer`基类和一些具体的计算机类,如`Laptop`和`Desktop`。

#include <iostream>
#include <memory>
#include <unordered_map>

// Computer基类,包含一个纯虚拟的克隆方法
class Computer {
public:
    virtual ~Computer() = default;
    virtual std::unique_ptr<Computer> clone() const = 0;
    virtual void display() const = 0;
};

// Laptop类,继承自Computer并实现克隆方法
class Laptop : public Computer {
private:
    int batteryLife;
public:
    Laptop(int battery) : batteryLife(battery) {}
    std::unique_ptr<Computer> clone() const override {
        return std::make_unique<Laptop>(*this);
    }
    void display() const override {
        std::cout << "Displaying a Laptop with battery life " << batteryLife << " hours\n";
    }
};

// Desktop类,继承自Computer并实现克隆方法
class Desktop : public Computer {
private:
    bool hasMonitor;
public:
    Desktop(bool monitor) : hasMonitor(monitor) {}
    std::unique_ptr<Computer> clone() const override {
        return std::make_unique<Desktop>(*this);
    }
    void display() const override {
        std::cout << "Displaying a Desktop " << (hasMonitor ? "with" : "without") << " monitor\n";
    }
};

int main() {
    // 创建原型对象
    std::unordered_map<std::string, std::unique_ptr<Computer>> prototypes;
    prototypes["laptop"] = std::make_unique<Laptop>(8);
    prototypes["desktop"] = std::make_unique<Desktop>(true);

    // 克隆对象
    std::unique_ptr<Computer> comp1 = prototypes["laptop"]->clone();
    std::unique_ptr<Computer> comp2 = prototypes["desktop"]->clone();

    // 显示克隆的对象
    comp1->display();
    comp2->display();

    return 0;
}

克隆文档对象

假设我们有一个`Document`基类和一些具体的文档类,如`WordDocument`和`PDFDocument`。

#include <iostream>
#include <memory>
#include <unordered_map>

// Document基类,包含一个纯虚拟的克隆方法
class Document {
public:
    virtual ~Document() = default;
    virtual std::unique_ptr<Document> clone() const = 0;
    virtual void print() const = 0;
};

// WordDocument类,继承自Document并实现克隆方法
class WordDocument : public Document {
private:
    int wordCount;
public:
    WordDocument(int words) : wordCount(words) {}
    std::unique_ptr<Document> clone() const override {
        return std::make_unique<WordDocument>(*this);
    }
    void print() const override {
        std::cout << "Printing a Word Document with word count " << wordCount << "\n";
    }
};

// PDFDocument类,继承自Document并实现克隆方法
class PDFDocument : public Document {
private:
    int pageCount;
public:
    PDFDocument(int pages) : pageCount(pages) {}
    std::unique_ptr<Document> clone() const override {
        return std::make_unique<PDFDocument>(*this);
    }
    void print() const override {
        std::cout << "Printing a PDF Document with page count " << pageCount << "\n";
    }
};

int main() {
    // 创建原型对象
    std::unordered_map<std::string, std::unique_ptr<Document>> prototypes;
    prototypes["word"] = std::make_unique<WordDocument>(5000);
    prototypes["pdf"] = std::make_unique<PDFDocument>(100);

    // 克隆对象
    std::unique_ptr<Document> doc1 = prototypes["word"]->clone();
    std::unique_ptr<Document> doc2 = prototypes["pdf"]->clone();

    // 打印克隆的对象
    doc1->print();
    doc2->print();

    return 0;
}

总结

每个原型类实现自己的克隆方法,从而确保了对象的正确复制。

相关推荐

  1. C++原型模式

    2024-06-12 22:42:03       8 阅读
  2. C++模板方法模式

    2024-06-12 22:42:03       5 阅读
  3. C++外观模式

    2024-06-12 22:42:03       7 阅读
  4. C++命令模式

    2024-06-12 22:42:03       7 阅读
  5. C++适配器模式

    2024-06-12 22:42:03       5 阅读
  6. C++组合模式

    2024-06-12 22:42:03       6 阅读
  7. C++状态模式

    2024-06-12 22:42:03       9 阅读
  8. C++策略模式

    2024-06-12 22:42:03       9 阅读
  9. C++备忘录模式

    2024-06-12 22:42:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 22:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 22:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 22:42:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 22:42:03       20 阅读

热门阅读

  1. #04 Stable Diffusion与其他AI图像生成技术的比较

    2024-06-12 22:42:03       11 阅读
  2. 趣谈网络协议

    2024-06-12 22:42:03       8 阅读
  3. 作文笔记11 推荐一本书

    2024-06-12 22:42:03       8 阅读
  4. Next.js 加载页面及流式渲染(Streaming)

    2024-06-12 22:42:03       4 阅读
  5. 【数据结构】利用单链表再实现通讯录

    2024-06-12 22:42:03       7 阅读
  6. 防止连续点击按钮,多次调用接口

    2024-06-12 22:42:03       9 阅读
  7. 【AI原理解析】— Gemini模型

    2024-06-12 22:42:03       6 阅读
  8. 常见库存超卖解决方案

    2024-06-12 22:42:03       10 阅读
  9. AI与环保:共同塑造我们未来的世界

    2024-06-12 22:42:03       7 阅读
  10. C++共享指针shared_ptr的理解分享

    2024-06-12 22:42:03       9 阅读