5. 原型模式 – 复制粘贴,一摸一样
简介
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新的对象,而无需从头开始构建。
使用场景
它通常用于以下情况:
- 当一个系统需要独立于其类型的对象时,它可以从已有的对象克隆出新的实例,而不是通过构造函数创建。
- 当创建一个对象的过程比复制一个现有对象更昂贵时,原型模式可以提高性能。
原型模式的关键思想是创建一个原型对象,然后根据该原型对象创建新的对象。这个原型对象通常是一个已经存在并配置好的对象,它包含了所需的初始状态和属性。新对象从原型对象复制其状态和属性,以便于快速创建多个相似的对象。
实现方式
在实现原型模式时,通常有两种方式:
- 浅拷贝(Shallow Copy):在浅拷贝中,只复制对象本身以及对象中的基本数据类型属性,但不会复制对象引用的其他对象。这意味着新对象和原型对象会共享一些对象引用,如果修改了这些共享引用指向的对象,会影响到原型对象和克隆对象。
- 深拷贝(Deep Copy):在深拷贝中,不仅复制对象本身和基本数据类型属性,还会递归复制对象引用的其他对象,以确保新对象和原型对象之间没有共享的引用。
优点和注意事项
原型模式的优点包括:
- 提高性能:避免了重复创建对象时的昂贵初始化过程。
- 简化对象创建:可以通过复制现有对象来创建新对象,无需了解对象的构造细节。
- 支持多态性:克隆操作可以用于创建子类对象。
需要注意的是,原型模式在某些情况下可能会引入复杂性,特别是在对象包含循环引用或大量子对象的情况下。因此,在使用原型模式时需要小心处理这些情况。
总之,原型模式是一种有助于创建对象的设计模式,它通过复制现有对象来创建新对象,提供了一种灵活、高效的方式来管理对象的创建和初始化。
实现
实现深拷贝方式,主要是写一个clone方法
// 原型模式
// 时间:2024-10-29
// 作者:@conceal
#include <iostream>
#include <string>
using namespace std;
// 原型类
class Prototype
{
public:
virtual Prototype *clone() = 0;
virtual void show() = 0;
};
// 具体原型类
class ConcretePrototype : public Prototype
{
public:
ConcretePrototype(const string &s)
{
m_str = s;
}
Prototype *clone()
{
return new ConcretePrototype(*this);
}
void show()
{
cout << m_str << endl;
}
private:
string m_str;
};
int main()
{
Prototype *p = new ConcretePrototype("A");
Prototype *p1 = p->clone();
p->show();
p1->show();
delete p;
delete p1;
return 0;
}
输出
A
A