计划模式-原型模式

打印 上一主题 下一主题

主题 1754|帖子 1754|积分 5262

原型模式

原型模式利用场景

当在我们的系统中存在大量相同或相似对象的创建问题,假如用传统的构造函数来创建对象,会比较复杂且耗时耗资源(主要是构造函数的实行),用原型模式天生对象就很高效,直接内存式的拷贝。
原型模式实现要点



  • 用一个已经创建的实例对象作为原型
  • 通过复制该原型对象来创建一个和原型对象相同或者相似的新对象
原型对象的实现方式

原型模式的布局


  • 抽象原型类:规定了详细原型对象必须实现的接口。
  • 详细原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  • 访问类:利用详细原型类中的clone()方法来复制新的对象。

  1. #include <cstdio>
  2. #include <iostream>
  3. using namespace std;
  4. class Prototype {
  5. protected:
  6.     string prototype_name_;
  7.     float prototype_field_;
  8. public:
  9.     Prototype() {}
  10.     Prototype(string prototype_name)
  11.         : prototype_name_(prototype_name) {
  12.     }
  13.     virtual ~Prototype() {}
  14.     virtual Prototype* Clone() const = 0;
  15.     virtual void Method(float prototype_field) {
  16.         this->prototype_field_ = prototype_field;
  17.         std::cout << "Call Method from " << prototype_name_ << " with field : " << prototype_field << std::endl;
  18.     }
  19. };
  20. class Realizetype1 : public Prototype {
  21. private:
  22.     float realize_prototype_field1_;
  23. public:
  24.     Realizetype1(string prototype_name, float concrete_prototype_field)
  25.         : Prototype(prototype_name), realize_prototype_field1_(concrete_prototype_field) {
  26.     }
  27.     /**
  28.      * 注意,Clone 方法返回一个新的克隆对象的指针,调用者必须释放其内存。
  29.      */
  30.     Prototype* Clone() const override {
  31.         return new Realizetype1(*this); //浅拷贝
  32.     }
  33. };
  34. class Realizetype2 : public Prototype {
  35. private:
  36.     float realize_field2_;
  37. public:
  38.     Realizetype2(string prototype_name, float concrete_prototype_field)
  39.         : Prototype(prototype_name), realize_field2_(concrete_prototype_field) {
  40.     }
  41.     Prototype* Clone() const override {
  42.         return new Realizetype2(*this);
  43.     }
  44. };
  45. int main()
  46. {
  47.     Realizetype1  sxz("孙悟空", 1000);
  48.     Realizetype2  zbj("猪八戒", 800);
  49.     Realizetype1* s1 = (Realizetype1*)sxz.Clone();
  50.     Realizetype2* z2 = (Realizetype2*)zbj.Clone();
  51.     s1->Method(1000);
  52.     z2->Method(800);
  53.     return 0;
  54. }
复制代码
原型模式的实现优点



  • 创建对象基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
  • 可以利用深克隆方式保存对象的状态,利用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候利用(比方恢复到历史某一状态),可辅助实现打消操纵。
原型模式的实现的缺点



  • 需要为每一个类都设置一个 clone 方法
  • clone 方法位于类的内部,当对已有类举行改造的时候,需要修改代码。
  • 当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用恰当。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

我爱普洱茶

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