04. 原型模式

原型模式,产生一份简历,其他简历从该简历进行clone,所以当这份简历改变后,之后clone的简历都会有所改变,这份简历就是原型。注意:原型模式涉及浅拷贝和深拷贝。代码示例如下:

/**
 * @file resume.h
 * @brief prototype pattern
 * @author timeshark
 * @version 1.0
 * @date 2018-08-06
 */

#ifndef RESUME_HPP
#define RESUME_HPP

#include <iostream>
#include <cstring>

using std::cout;
using std::endl;

class Resume {
protected:
    char *name;
public:
    Resume() {}
    virtual ~Resume() {}
    virtual Resume* clone() { return NULL; }
    virtual void set(const char* str) {}
    virtual void show() {}
};

class ResumeA : public Resume {
public:
    ResumeA(const char *str);
    ResumeA(const ResumeA &r);
    ~ResumeA();
    ResumeA* clone();
    void set(const char *str);
    void show();
};

ResumeA::ResumeA(const char *str) {
    if (str == NULL) {
        name = new char[1];
        name[0] = '\0';
    } else {
        name = new char[strlen(str) + 1];
        strcpy(name, str);
    }
}

ResumeA::~ResumeA() {
    delete[] name;
}

ResumeA::ResumeA(const ResumeA &r) {
    name = new char[strlen(r.name) + 1];
    strcpy(name, r.name);
}

ResumeA* ResumeA::clone() {
    return new ResumeA(*this);
}

void ResumeA::set(const char* str) {
    if (name) {
        delete[] name;
    }
    if (str == NULL) {
        name = new char[1];
        name[0] = '\0';
    } else {
        name = new char[strlen(str) + 1];
        strcpy(name, str);
    }
}

void ResumeA::show() {
    cout << "resume name: " << name << endl;
}

#endif
/**
 * @file main.cpp
 * @brief main
 * @author timeshark
 * @version 1.0
 * @date 2018-08-06
 */

#include "resume.h"

int main() {
    Resume* r1 = new ResumeA("zhangsan");
    Resume* r2 = r1->clone();
    Resume* r3 = r1->clone();
    cout << "r1 name: ";
    r1->show();
    cout << "r2 name: ";
    r2->show();
    cout << "r3 name: ";
    r3->show();

    r1->set("lisi");
    Resume* r4 = r1->clone();
    Resume* r5 = r1->clone();
    cout << "r1 name: ";
    r1->show();
    cout << "r4 name: ";
    r4->show();
    cout << "r5 name: ";
    r5->show();

    return 0;
}

输出:

猜你喜欢

转载自blog.csdn.net/x_shuck/article/details/81461799