原型设计模式是一种创建型模式
优点:
- 可以在运行时动态地创建新对象,而不必知道它们的确切类型。
- 可以避免创建新对象时所需的构造函数调用开销。
- 可以更容易地创建复杂对象,因为可以通过复制现有对象来创建新对象
缺点:
- 需要实现 Clone 方法,这可能会增加代码的复杂性。
- 如果对象内部包含指针或引用其他对象,则需要实现深拷贝,这可能会增加代码的复杂性。
- 如果对象内部状态发生变化,则需要更新原型对象,否则新创建的对象可能不符合预期。
满足的设计原则:
- 开闭原则(Open-Closed Principle, OCP):原型模式允许您在不修改现有代码的情况下,通过添加新的原型对象来扩展系统的功能。
- 依赖倒置原则(Dependency Inversion Principle, DIP):原型模式中,高层模块依赖于抽象的Prototype 类,而不是依赖于具体的 ConcretePrototype 类。
- 这样,高层模块就不会受到具体类的影响,从而实现了依赖倒置。
常用场景:
- 当需要在运行时动态地创建新对象,而不必知道它们的确切类型时,可以使用原型模式。
- 当需要创建复杂对象,且通过复制现有对象来创建新对象比调用构造函数更方便时,可以使用原型模式。
- 当需要避免创建新对象时所需的构造函数调用开销时,可以使用原型模式。
- 例如,在游戏开发中,可以使用原型模式来创建游戏角色。游戏角色通常具有复杂的属性和行为,通过复制现有角色来创建新角色比调用构造函数更方便。
- 此外,在文档编辑器中,可以使用原型模式来实现复制和粘贴功能。用户可以复制文档中的一个元素,然后粘贴到其他位置,从而快速创建新元素。
类图:
代码:
#include "iostream"
#include "string"
using namespace std;
class Prototype
{
public:
virtual ~Prototype(){};
virtual Prototype*Clone()=0;
};
class ConcretePrototype :public Prototype {
public:
virtual ~ConcretePrototype() {};
//深拷贝构造函数
ConcretePrototype(ConcretePrototype&concrete)
{
m_counter=new int;
*m_counter=*concrete.m_counter;
}
ConcretePrototype* Clone()
{
//调用深拷贝构造函数
return new ConcretePrototype(*this);
}
ConcretePrototype(int* a) :m_counter(a) {};
int* m_counter;
};
int main_Prototype()
{
int v=8;
int *h=&v;
ConcretePrototype*con=new ConcretePrototype(h);
ConcretePrototype*conB=con->Clone();
return 0;
}