一 介绍
原型设计模式,允许通过复制已有对象的实例,来创建新的对象,并且不需要显示的实例化过程。
目的是通过复制现有对象来创建新对象,从而减少了对象的实例化开销。(避免了一些数据的初始化,读取,加载数据,资源的获取等)
二 原理
定义一个原型接口:首先需要定义一个原型接口,通常是一个抽象类或接口,其中声明了一个克隆方法用于复制对象。
实现原型类:创建具体的原型类,实现原型接口,并实现克隆方法,该方法用于返回当前对象的副本。
使用克隆方法创建新对象:当需要创建新对象时,调用原型对象的克隆方法,从而生成一个新的对象实例。并且克隆这个对象不需要使用构造函数。
三 使用场景
对象创建开销大:当对象的创建过程涉及到复杂的初始化操作或需要大量资源时,使用原型模式可以避免重复执行这些操作,提高性能。
c避免构造函数复杂度:当一个类的构造函数非常复杂,或者构造函数的参数组合非常多时,使用原型模式可以避免构造函数的复杂度,通过克隆现有对象来创建新对象。
需要避免继承的代价:在某些情况下,由于类的结构复杂性或者多重继承的问题,继承不是一个好的选择。此时,原型模式可以作为一个替代方案,通过复制现有对象来创建新对象,而不需要通过继承来实现。
保护对象的成员变量:有时候需要创建一个对象的副本,并对副本进行修改,而不影响原始对象。使用原型模式可以很容易地实现这一点,因为克隆对象与原始对象相互独立。
四 理解
- 简单来说,就是克隆,并且当这个对象的初始化,已经构造函数的传参,或者其他操作比较复杂时,使用原型模式来简化这种操作是及其方便的。
- 使用原型模式,可以更加灵活,因为我们可以将调用接口设置为多态。也就是说,克隆可能会在父类和子类之间进行,并且可能是动态的,很明显通过父类的拷贝构造函数无法实现对子类对象的拷贝。
- 原型模式的实现主要是clone接口,但同时也要注意深浅拷贝的问题。
五 UML类图
六 代码实现
#include <iostream>
#include <windows.h>
using namespace std;
class CloneTrooper
{
public:
virtual CloneTrooper* clone() = 0;
virtual void arms() = 0;
virtual ~CloneTrooper(){}
};
class CloneTrooperNavy : public CloneTrooper
{
public:
virtual CloneTrooperNavy* clone() override
{
return new CloneTrooperNavy(*this);
}
virtual void arms() override
{
cout<<"海军052D驱逐舰"<<endl;
}
virtual ~CloneTrooperNavy(){}
};
class CloneTrooperArmy : public CloneTrooper
{
public:
virtual CloneTrooperArmy* clone()override
{
return new CloneTrooperArmy(*this);
}
virtual void arms() override
{
cout<<"陆军合成旅"<<endl;
}
virtual ~CloneTrooperArmy(){}
};
int main()
{
SetConsoleOutputCP(CP_UTF8);
CloneTrooper* obj = new CloneTrooperNavy;
CloneTrooper* Trooper = obj->clone();
Trooper->arms();
obj = new CloneTrooperArmy;
Trooper = obj->clone();
Trooper->arms();
delete Trooper;
delete obj;
return 0;
}