您的位置:首页 > 新闻 > 热点要闻 > 阿里云备案域名出售_工程建设标准化期刊是什么级别_网上找客户有什么渠道_站长之家ppt模板

阿里云备案域名出售_工程建设标准化期刊是什么级别_网上找客户有什么渠道_站长之家ppt模板

2025/2/25 4:43:30 来源:https://blog.csdn.net/ox0080/article/details/145599739  浏览:    关键词:阿里云备案域名出售_工程建设标准化期刊是什么级别_网上找客户有什么渠道_站长之家ppt模板
阿里云备案域名出售_工程建设标准化期刊是什么级别_网上找客户有什么渠道_站长之家ppt模板

以下是一个使用 C++ 实现的经典原型模式示例,包含测试代码:

#include <iostream>
#include <string>
#include <memory>// 抽象原型类
class Shape {
public:virtual ~Shape() = default;virtual std::unique_ptr<Shape> clone() const = 0;virtual void draw() const = 0;virtual void setColor(const std::string& color) = 0;
};// 具体原型类:圆形
class Circle : public Shape {std::string color;double radius;double x, y;public:Circle(const std::string& color, double radius): color(color), radius(radius), x(0), y(0) {}// 拷贝构造函数(用于克隆)Circle(const Circle& other) : color(other.color), radius(other.radius), x(other.x), y(other.y) {}std::unique_ptr<Shape> clone() const override {return std::make_unique<Circle>(*this);}void draw() const override {std::cout << "Drawing Circle at (" << x << ", " << y << ") with radius " << radius << " and color " << color << "\n";}void setPosition(double x, double y) {this->x = x;this->y = y;}void setColor(const std::string& color) override {this->color = color;}
};// 具体原型类:矩形
class Rectangle : public Shape {std::string color;double width;double height;double x, y;public:Rectangle(const std::string& color, double w, double h): color(color), width(w), height(h), x(0), y(0) {}Rectangle(const Rectangle& other): color(other.color), width(other.width), height(other.height),x(other.x), y(other.y) {}std::unique_ptr<Shape> clone() const override {return std::make_unique<Rectangle>(*this);}void draw() const override {std::cout << "Drawing Rectangle at (" << x << ", " << y << ") size " << width << "x" << height<< " color " << color << "\n";}void setPosition(double x, double y) {this->x = x;this->y = y;}void setColor(const std::string& color) override {this->color = color;}
};// 客户端/测试代码
int main() {// 创建原型对象Circle circlePrototype("Red", 10.0);Rectangle rectanglePrototype("Blue", 20.0, 30.0);// 克隆并修改圆形auto clonedCircle = circlePrototype.clone();clonedCircle->setColor("Green");dynamic_cast<Circle*>(clonedCircle.get())->setPosition(5, 5);// 克隆并修改矩形auto clonedRect = rectanglePrototype.clone();clonedRect->setColor("Yellow");dynamic_cast<Rectangle*>(clonedRect.get())->setPosition(10, 10);// 测试输出std::cout << "Original Circle:\n";circlePrototype.draw();std::cout << "\nCloned Circle:\n";clonedCircle->draw();std::cout << "\nOriginal Rectangle:\n";rectanglePrototype.draw();std::cout << "\nCloned Rectangle:\n";clonedRect->draw();// 验证深拷贝auto anotherClone = circlePrototype.clone();dynamic_cast<Circle*>(anotherClone.get())->setPosition(100, 100);std::cout << "\nModified clone position:\n";anotherClone->draw();std::cout << "Original circle position remains unchanged:\n";circlePrototype.draw();return 0;
}

这个示例演示了:

  1. 原型模式结构

    • Shape 是抽象原型接口
    • CircleRectangle 是具体原型类
    • 使用 clone() 方法创建新对象
  2. 关键实现细节

    • 使用拷贝构造函数实现克隆
    • 通过智能指针(unique_ptr)管理对象生命周期
    • 支持深拷贝(所有成员变量都被正确复制)
    • 提供修改方法验证克隆独立性
  3. 测试验证内容

    • 克隆对象的基本功能
    • 修改克隆对象不影响原型
    • 类型正确性(通过 dynamic_cast)
    • 深拷贝的正确性验证

输出结果示例:

Original Circle:
Drawing Circle at (0, 0) with radius 10 and color RedCloned Circle:
Drawing Circle at (5, 5) with radius 10 and color GreenOriginal Rectangle:
Drawing Rectangle at (0, 0) size 20x30 color BlueCloned Rectangle:
Drawing Rectangle at (10, 10) size 20x30 color YellowModified clone position:
Drawing Circle at (100, 100) with radius 10 and color Red
Original circle position remains unchanged:
Drawing Circle at (0, 0) with radius 10 and color Red

这个示例展示了原型模式的核心思想:通过克隆现有对象来创建新对象,同时保持克隆对象与原型对象的独立性。使用智能指针可以自动管理内存,而通过拷贝构造函数实现的深拷贝确保了对象状态的独立复制。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com