当前位置: 首页 > article >正文

原型模式-C++实现

原型模式是一种创建型设计模式,它允许通过克隆现有的对象来生成新的对象,而不是通过实例化新对象。

原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些“异变类”有稳定的接口。

举例:
假设有一个游戏中的怪物类 Monster,每个怪物有不同的属性和行为。在游戏中,需要动态创建大量的怪物对象。

// 怪兽基类
class Monster
{
protected:
	std::string monster_name_;

public:
	virtual ~Monster() {}

	virtual std::shared_ptr<Monster> Clone() = 0;

	virtual void Info() = 0;

	virtual void SetMonsterName(const std::string& _name) = 0;
};

// 具体怪兽类
class Goblin
	: public Monster
{
public:

	Goblin(const std::string& _monster_name)
	{
		monster_name_ = _monster_name;
	}

	virtual std::shared_ptr<Monster> Clone() override
	{
		return std::make_shared<Goblin>(*this);
	}

	virtual void Info() override
	{
		std::cout << "这是" << monster_name_ << "怪兽" << std::endl;
	}

	virtual void SetMonsterName(const std::string& _name) override
	{
		monster_name_ = _name;
	}
};

class Skeleton
	: public Monster
{
public:

	Skeleton(const std::string& _monster_name)
	{
		monster_name_ = _monster_name;
	}

	virtual std::shared_ptr<Monster> Clone() override
	{
		return std::make_shared<Skeleton>(*this);
	}

	virtual void Info() override
	{
		std::cout << "这是" << monster_name_ << "怪兽" << std::endl;
	}

	virtual void SetMonsterName(const std::string& _name) override
	{
		monster_name_ = _name;
	}
};

测试:

void TestPrototype()
{
	// 创建原型怪兽
	std::shared_ptr<Monster> goblin = std::make_shared<Goblin>("小龙");
	std::shared_ptr<Monster> skeleton = std::make_shared<Skeleton>("大龙");

	goblin->Info();
	skeleton->Info();

	goblin->SetMonsterName("黑暗暴君");

	// 动态的创建大量怪兽
	for (int i = 0; i < 5; i++)
	{
		std::shared_ptr<Monster> temp = goblin->Clone();

		temp->Info();
	}
}

输出:

这是小龙怪兽
这是大龙怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽

我们创建了一个怪兽基类,两个具体的怪兽类,测试代码中我们先是创建了两个不同的原型怪兽类,通过for循环创建大量的怪兽类。

我们可以看到它们其实都是保持独立并且具有相同的状态。

原型模式适用于以下场景:

1、当一个系统需要创建大量相似对象时,可以使用原型模式来提高性能和减少内存消耗。通过克隆原型对象,可以避免重复执行相同的初始化操作,从而减少对象创建的开销。

2、当一个对象的创建过程比较复杂或者需要访问外部资源时,可以使用原型模式来简化对象的创建过程。可以通过克隆原型对象并对其进行适当的修改,快速创建一个新对象,而无需重新执行复杂的初始化过程或访问外部资源。

3、当需要动态地添加或删除对象时,可以使用原型模式来简化对象的创建和管理。可以创建一个原型对象,然后根据需要克隆多个相同类型的对象,并进行相应的修改。

4、当希望隐藏对象的具体类型,并通过通用接口来操作对象时,可以使用原型模式。克隆出来的对象可以统一使用原型的抽象类型,对外部代码透明,增加了灵活性。

简化一下:

原型模式具有以下优点:

1、简化对象创建:原型模式通过复制现有对象来创建新对象,避免了繁琐的初始化过程,使得对象创建变得简单且灵活。

2、提高性能:相比于直接创建对象,原型模式的对象复制效率更高,可以节省不必要的资源消耗。

3、动态添加和修改对象:通过修改原型对象的属性,可以动态地创建和

4、修改新对象,无需编写额外的代码进行变化。

5、隐藏实现细节:原型模式隐藏了对象创建的细节,使得客户端无需关注对象的创建过程,只需关注如何获取新的对象。

缺点:

1、对象克隆可能较为复杂:如果对象内部存在深层次的引用关系,需要保证克隆的完整性,并正确处理对象的引用关系,可能会增加代码的复杂性。

2、需要使用原型管理器:通过原型模式创建对象时需要维护原型对象的管理,增加了系统的复杂性。

3、克隆方法的实现可能受限:在某些编程语言中,对象的克隆方法可能受限于语言本身的特性,例如私有属性的克隆等。


http://www.kler.cn/news/136281.html

相关文章:

  • Spring WebFlux学习笔记(一)
  • 在多数据中心环境中,自动化运维如何保证跨区域的一致性?网络延迟导致的数据不一致是否可以完全避免?|自动化运维|跨区域一致性
  • SQL SERVER 2005/2008/2012/2016/2020 数据库状态为“可疑”的解决方法(亲测可用)
  • 雷赛L6N伺服驱动器基本参数设置——EtherCAT 总线型
  • 构建中小企业设备管理平台:Spring Boot应用
  • Ubuntu20.04系统安装opencv
  • 《崩坏:星穹铁道》1.5仙舟罗浮-绥园全宝箱攻略
  • 【Linux】软连接和硬链接:创建、管理和解除链接的操作
  • Flutter 中数据存储的四种方式
  • 机器学习笔记 - Ocr识别中的CTC算法原理概述
  • JVM:内存模型、内存分配机制、内存分配冲突、JVM垃圾标记算法、JVM1.8增加元数据区缘由
  • python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例
  • 机器学习第8天:SVM分类
  • 创新工具 | 教你6步用故事板设计用户体验事半功倍
  • 【计算机网络笔记】路由算法之链路状态路由算法
  • 集合的自反关系和对称关系
  • Wireshark 截取指定端口海量包分析
  • 【Spring Boot】如何集成Redis
  • 【心得】基于flask的SSTI个人笔记
  • Oracle 数据库中 查询时如何使用日期(时间)作为查询条件
  • 使用Python的turtle模块绘制玫瑰花图案(含详细Python代码与注释)
  • C++二分查找算法:132模式枚举3简洁版
  • IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven依赖管理,版本号管理,继承和聚合
  • 软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建
  • Wireshark抓包:理解TCP三次握手和四次挥手过程
  • Redis-高性能原理剖析