一 介绍
原型设计模式,允许通过复制已有对象的实例,来创建新的对象,并且不需要显示的实例化过程。
目的是通过复制现有对象来创建新对象,从而减少了对象的实例化开销。(避免了一些数据的初始化,读取,加载数据,资源的获取等)
二 原理
-
定义一个原型接口:首先需要定义一个原型接口,通常是一个抽象类或接口,其中声明了一个克隆方法用于复制对象。
-
实现原型类:创建具体的原型类,实现原型接口,并实现克隆方法,该方法用于返回当前对象的副本。
-
使用克隆方法创建新对象:当需要创建新对象时,调用原型对象的克隆方法,从而生成一个新的对象实例。并且克隆这个对象不需要使用构造函数。
三 使用场景
-
对象创建开销大:当对象的创建过程涉及到复杂的初始化操作或需要大量资源时,使用原型模式可以避免重复执行这些操作,提高性能。
-
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;
}