03_23 种设计模式之《原型模式》

文章目录

一、原型模式基础知识

原型模式是一种创建型设计模式,其功能为复制一个运行时的对象,包括对象各个成员当前的值。而代码又能保持独立性。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

主要解决:在运行期建立和删除原型。
优点:性能提高、避免构造函数的约束。

原型模式的结构

原型接口(Prototype Interface):通常包含一个克隆自己的方法。

具体原型类(Concrete Prototype):实现原型接口,提供克隆自身的具体实现。

客户端(Client):让一个原型克隆自身,并对克隆体进行修改。

应用场景

原型模式适用于以下情况:
创建新对象成本较大:如果创建对象的过程非常复杂或者资源消耗较大,使用原型模式可以避免这些开销。
需要保留对象的历史状态:原型模式可以很容易地复制对象的状态,适用于需要回溯对象状态的场景。
当系统需要避免创建多个相同对象时:如果系统频繁创建相同或相似的对象,使用原型模式可以提高效率。

实例

cpp 复制代码
#include <iostream>
using namespace std;

class ProtoType {  // 凡是含有纯虚函数的类叫做抽象类
public:
	ProtoType(){
	}
	~ProtoType() {
	}

	virtual ProtoType* CloneFunc() = 0;  // 纯虚函数
};

class ConreteProtoType:public ProtoType
{
public:
	ConreteProtoType(int imember):_member(imember) {
		cout << "执行ConreteProtoType带参构造函数.\n" << endl;
	}
	~ConreteProtoType() {
		cout << "执行ConreteProtoType析构函数." << endl;
	}

	// 拷贝构造函数(若有指针成员变量,要进行实现深拷贝)
	ConreteProtoType(const ConreteProtoType& rhs) {
		_member = rhs._member;
		cout << "数据成员_member1:" << _member << endl;
	}

	ConreteProtoType* CloneFunc() { // 派生类实现
		cout << "正在处理克隆." << endl;
		cout << "数据成员_member2:" << _member << endl;
		return new ConreteProtoType(*this);
	}

private:
	int _member;

};

int main()
{
	cout << "main()函数-->原型模式开始.\n" << endl;

	ConreteProtoType* CloneObjA = new ConreteProtoType(88);
	ConreteProtoType* CloneObjB = CloneObjA->CloneFunc();

	cout << endl;

	delete CloneObjA;
	CloneObjA = nullptr;
	delete CloneObjB;
	CloneObjB = nullptr;

	return 0;
}
复制代码
main函数-->原型模式开始
ConcretePrototype带参构造函数
正处理克隆
数据成员_member2:88
数据成员_member1:88
ConcretePrototype析构函数
ConcretePrototype析构函数
main函数-->原型模式结束

拷贝构造函数被调用场景如下:

1、用已知对象初始化一个正在被创建的对象,调用拷贝构造函数;

2、函数形式参数为对象的时候,实参对象向形参对象传递,调用

拷贝构造函数。

3、函数的返回值为对象的时候,当需要获取返回值时,调用拷贝

构造函数

典型的应用场景:

  1. 报表生成:在报表系统中,用户可以创建并保存各种报表模板,当需要生成报表时,可以直接克隆这些模板,而不需要重新设置复杂的配置信息。

  2. 游戏角色复制:在游戏开发中,可以通过原型模式复制角色,快速生成大量相似的游戏对象,如士兵、怪物等。

  3. 复杂对象的快速创建:当对象的创建过程非常复杂或者耗时较长时,可以通过原型模式复制已有对象来避免重复的创建过程,如从数据库加载大量数据的对象。

  4. 对象的深克隆:在需要对象副本并且希望副本与原对象完全独立时,可以使用原型模式进行深克隆,这在对象包含复杂引用结构时非常有用。

  5. 原型注册表:在某些系统中,可以维护一个原型注册表,里面存储了各种类型的原型对象。当需要创建对象时,直接从注册表中克隆原型对象,这样可以提高对象创建的效率。

  6. 配置对象的复制:在配置管理系统中,可以通过原型模式复制配置对象,快速生成新的配置实例,而不需要重新解析配置文件。

  7. 设计模式的动态加载:在需要动态加载设计模式对象的情况下,可以使用原型模式来创建对象,这样可以避免直接实例化类,提高系统的灵活性和可扩展性。

  8. 用户界面克隆:在用户界面设计中,可以通过原型模式复制界面元素,如按钮、菜单等,这样可以快速创建多个相似的界面元素。

  9. 数据备份:在需要备份大量数据时,可以使用原型模式创建数据的副本,这样可以避免数据的重复输入,提高数据备份的效率。

  10. 实验和模拟:在科学计算和工程设计中,原型模式可以用来复制实验设置或模拟环境,以便进行多次独立的实验或模拟。

通过使用原型模式,可以提高对象创建的效率,减少系统的资源消耗,并提高代码的可维护性和可扩展性。

相关推荐
_Twink1e3 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
dong_junshuai3 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
雪的季节4 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++
Persistent的粽子!5 小时前
C++:类与对象(二)
开发语言·c++
蒸蒸yyyyzwd6 小时前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z6 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊7 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN8 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.8 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~9 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史