开淘宝的店铺网站怎么做,网站建设布为网,买域名的网站有哪些,百度关键字优化价格文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义
用原型实例指定创建对象的种类#xff0c;并且通过拷贝这些原型创建新的对象#xff1b; 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式#xff0c;它的主要… 文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义
用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式它的主要意图是通过复制现有的对象实例来创建新的对象而不是通过传统的使用构造函数来初始化创建。
原型模式UML图 优点
提高创建对象的效率当创建一个对象的过程比较复杂例如需要进行大量的初始化操作、读取配置文件等如果采用传统的构造方式每次创建都要重复这些复杂过程而原型模式通过复制已有对象能快速创建新对象节省时间和资源。 便于动态创建对象可以在运行时根据已有对象动态生成新的对象对于一些需要根据不同场景灵活生成相似对象的情况非常有用。
缺点
深拷贝和浅拷贝问题在实现对象复制时如果对象中包含指针等复杂成员需要正确处理深拷贝和浅拷贝的情况否则可能导致数据不一致等问题。比如浅拷贝只是简单复制指针多个对象会指向同一块内存区域修改一个对象的数据可能意外影响到其他对象。 每一个类都要配备克隆方法要使用原型模式需要在具体的类中实现克隆复制的相关方法增加了代码编写和维护的工作量。
使用场景
对象创建成本高的情况比如创建一个数据库连接对象初始化过程涉及到加载驱动、配置参数、建立网络连接等复杂操作后续需要多个相似的连接对象时就可以用原型模式复制已有的连接对象来快速创建新的。 根据已有对象生成变体对象例如在图形绘制系统中已经绘制了一个圆形要基于这个圆形生成几个大小、颜色等属性稍有不同的新圆形通过原型模式复制已有圆形对象再进行属性修改就很方便。
C 代码示例
以下是一个简单的 C 代码示例来演示原型模式这里假设有一个简单的 Shape图形类作为基类有 Rectangle矩形类继承自它通过原型模式来复制矩形对象
#include iostream
#include string// 抽象基类定义克隆接口
class Shape
{
public:virtual Shape* clone() 0;virtual void draw() 0;virtual ~Shape() {}
};// 具体的矩形类
class Rectangle : public Shape
{
private:int width;int height;
public:Rectangle(int w, int h) : width(w), height(h) {}// 实现克隆方法返回一个新的矩形对象副本Shape* clone() override {return new Rectangle(*this);}void draw() override{std::cout Drawing a rectangle with width: width and height: height std::endl;}
};int main()
{Rectangle originalRect(10, 20);originalRect.draw();// 通过原型模式复制矩形对象Shape* clonedRect originalRect.clone();clonedRect-draw();delete clonedRect;char t;std::cint;return 0;
}在上述代码中 首先定义了抽象基类 Shape它有一个纯虚函数 clone 用于克隆对象还有一个纯虚函数 draw 用于绘制图形这里只是简单输出图形相关信息示意。 Rectangle 类继承自 Shape它有自己的成员变量 width 和 height 表示矩形的宽和高其构造函数用于初始化这两个属性。关键的是实现的 clone 函数通过 new Rectangle(this) 利用拷贝构造函数创建了一个新的 Rectangle 对象这个新对象就是原对象的副本然后返回这个副本的指针以 Shape 类型返回体现了多态性。 在 main 函数中先创建了一个原始的矩形对象 originalRect 并调用 draw 展示其信息然后通过原型模式调用 clone 方法复制出一个新的矩形对象 clonedRect同样调用 draw 展示最后记得释放动态分配的内存通过 delete 操作符避免内存泄漏。 实际应用中如果类的成员变量有指针等情况可能还需要更细致地处理拷贝构造函数来确保深拷贝正确执行避免出现意外的数据共享和修改问题。
深拷贝、浅拷贝
浅拷贝仅复制对象的引用指针而深拷贝会创建一个新对象并复制对象的内容。 同一类型的对象之间可以赋值使得两个对象的成员变量的值相同两个对象仍然是独立的两个对象这种情况被称为浅拷贝. 一般情况下浅拷贝没有任何副作用但是当类中有指针并且指针指向动态分配的内存空间析构函数做了动态内存释放的处理会导致内存问题。
class MyClass {
public:int* data;MyClass(int value) {data new int(value);}// 浅拷贝构造函数MyClass(const MyClass other) {data other.data; // 浅拷贝指针复制}// 析构函数~MyClass() {delete data;}
};class MyClass {
public:int* data;MyClass(int value) {data new int(value);}// 深拷贝构造函数MyClass(const MyClass other) {data new int(*(other.data)); // 深拷贝复制对象内容}// 赋值运算符进行深拷贝MyClass operator(const MyClass other) {if (this ! other) {delete data;data new int(*(other.data)); // 深拷贝}return *this;}// 析构函数~MyClass() {delete data;}
};