• 原型模式-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;
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    测试:

    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();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:

    这是小龙怪兽
    这是大龙怪兽
    这是黑暗暴君怪兽
    这是黑暗暴君怪兽
    这是黑暗暴君怪兽
    这是黑暗暴君怪兽
    这是黑暗暴君怪兽
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

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

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

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

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

    简化一下:

    原型模式具有以下优点:

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

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

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

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

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

    缺点:

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

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

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

  • 相关阅读:
    黑马程序:springboot
    Java泛型:类型擦除
    MySQL 45 讲 | 11 怎么给字符串字段加索引?
    【存储数据恢复】某品牌EqualLogic系列存储介绍和数据恢复方法
    济南申报高新技术企业不符合的条件
    Kettle实现对源数据已删除但历史同步到的数据进行打标
    网络地图服务(WMS)详解
    【数据结构】~顺序表
    MTX-Ovalbumin 甲氨蝶呤修饰卵清蛋白 Methotrexate-Ovalbumin
    ElasticSearch统计总数据量
  • 原文地址:https://blog.csdn.net/m0_51415606/article/details/134521787