zoukankan      html  css  js  c++  java
  • Prototype 原型模式

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    原型模式即在运行时动态的通过一个对象的实例来创建这个类的对象,可以理解成通过一个实例克隆出另一个实例。

    Prototype模式的一些优点:

    • 对客户隐藏具体的类,使客户直接可使用与特定应用相关的类。
    • 运行时刻增加和删除产品。
    • 改变值以指定新对象。
    • 改变结构以指定新对象。
    • 减少子类的构造。
    • 用类动态配置应用。

    在实现时要考虑一些问题:

    • 使用一个原型管理器。当一个系统中原型的数目不固定时,要保持一个可用原型的注册表。客户在注册表中存储和检索原型。客户在克隆一个原型前会在注册表请求该原型。称这个注册表为原型管理器。
    • 实现克隆操作时要注意深拷贝。
    • 初始化克隆对象时的参数要慎重考虑。
     1 #include <iostream>
     2 #include <string>
     3 
     4 class Prototype {
     5 public:
     6     virtual ~Prototype() = 0;
     7     virtual Prototype* Clone() = 0;
     8     virtual void message() = 0;
     9 };
    10 Prototype::~Prototype(){}
    11 
    12 class ConcretePrototype : public Prototype {
    13 private:
    14     std::string str;
    15 public:
    16     ConcretePrototype() { str = ""; }
    17     ConcretePrototype(std::string s) { str = s; }
    18     ConcretePrototype(const ConcretePrototype& r) {
    19         std::cout << "拷贝构造" << std::endl;
    20         str = r.str;
    21     }
    22     virtual void message() {
    23         std::cout << str << std::endl;
    24     }
    25     virtual ~ConcretePrototype() {}
    26     virtual Prototype* Clone()
    27     {
    28         std::cout << "克隆操作" << std::endl;
    29         return new ConcretePrototype(*this);
    30     }
    31 };

    测试代码

     1 #include <iostream>
     2 #include "Prototype.h"
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     Prototype* p = new ConcretePrototype("秘密");
     9     p->message();
    10     Prototype* q = p->Clone();
    11     q->message();
    12     system("pause");
    13 }

    测试结果

    1 秘密
    2 克隆操作
    3 拷贝构造
    4 秘密
    5 请按任意键继续. . .
  • 相关阅读:
    【POJ 2778】DNA Sequence
    【POJ 2923】Relocation
    codeforces 475D
    hdu4742
    hdu4741
    hdu5016
    poj3929
    Codeforces Round #267 (Div. 2)
    codeforces 455E
    hdu4073 Lights
  • 原文地址:https://www.cnblogs.com/zinthos/p/3951771.html
Copyright © 2011-2022 走看看