C++二十三种计划模式之原型模式

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、组成

抽象原型类:声明克隆接口。
详细原型类:实现克隆接口。
二、特点

1、通过详细原型类克隆的对象只是部分属性值不同。
2、克隆函数内部可用拷贝构造函数赋值。
三、目的

通过已有对象来复制新对象,不同对象之间仅部分属性有差别。
四、缺点

1、场景限制问题,如果对象内部存在循环引用或动态分配的资源会比较贫苦。
2、深拷贝和浅拷贝问题,对象有嵌套结构则必要复杂的深拷贝逻辑。
五、示例代码

  1. #include<iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <string>
  5. #include <mutex>
  6. #include <map>
  7. #include<stack>
  8. using namespace std;
  9. class Prototype;//抽象原型类
  10. class BaseCharacter;//抽象类
  11. class Player;//具体原型类
  12. class Enemy;//具体原型类
  13. class Prototype {
  14. public:
  15.         Prototype() {}
  16.         virtual shared_ptr<Prototype> clone() = 0;
  17.         virtual void setHealth(int health) = 0;
  18.         virtual void setAttack(int attack) = 0;
  19.         virtual void setDefense(int defense) = 0;
  20.         virtual void setName(string name) = 0;
  21.         virtual void print() = 0;
  22. };
  23. class BaseCharacter : public Prototype {
  24. public:
  25.         BaseCharacter() {}
  26.         BaseCharacter(string name, int health, int attack, int defense) :m_name(name), m_health(health), m_attack(attack), m_defense(defense) {};
  27.         void setHealth(int health) {
  28.                 m_health = health;
  29.         };
  30.         void setAttack(int attack) {
  31.                 m_attack = attack;
  32.         };
  33.         void setDefense(int defense) {
  34.                 m_defense = defense;
  35.         };
  36.         void setName(string name) {
  37.                 m_name = name;
  38.         };
  39.         void print() {
  40.                 cout << "name:" << m_name << ",health:" << m_health << endl;
  41.         }
  42. protected:
  43.         int m_health;
  44.         int m_attack;
  45.         int m_defense;
  46.         string m_name;
  47. };
  48. class Player : public BaseCharacter {
  49. public:
  50.         Player(string name, int health, int attack, int defense) : BaseCharacter(name, health, attack, defense) {};
  51.         ~Player() {
  52.                 cout << "~Player " << m_name << endl;
  53.         }
  54.         shared_ptr<Prototype> clone() {
  55.                 return make_shared<Player>(*this);
  56.         };
  57. };
  58. class Enemy : public BaseCharacter {
  59. public:
  60.         Enemy(string name, int health, int attack, int defense) : BaseCharacter(name, health, attack, defense) {};
  61.         ~Enemy() {
  62.                 cout << "~Enemy " << m_name << endl;
  63.         }
  64.         shared_ptr<Prototype> clone() {
  65.                 return make_shared<Enemy>(*this);
  66.         };
  67. };
  68. void test() {
  69.         auto player1 = make_shared<Player>("Player1", 1, 2, 3);
  70.         player1->setHealth(100);
  71.         auto player2 = player1->clone();
  72.         player2->setName("Player2");
  73.         player1->setHealth(1000);
  74.         player2->print();
  75.         player1->print();
  76. }
  77. int main() {
  78.         test();
  79. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表