原型模式-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、克隆方法的实现可能受限:在某些编程语言中,对象的克隆方法可能受限于语言本身的特性,例如私有属性的克隆等。

你可能感兴趣的:(设计模式,原型模式,c++,开发语言)