设计模式之原型模式(Prototype)

本文介绍了一种设计模式——原型模式,并通过具体的代码示例展示了如何在C++中实现该模式。原型模式通过拷贝已有对象来创建新对象,相较于直接new一个对象而言,开销更小。文中提供了一个简历类(Resume)作为示例,展示了如何实现原型模式并克隆对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式:

优点:

使用拷贝比new一个对象的开销要小


代码示例:

Prototype.h

#ifndef PROTOTYPE_H
#define PROTOTYPE_H

/**
 *1、声明一个抽象基类,并定义clone()函数为纯虚函数。
 *2、实例化各个子类,并且实现复制构造函数,并实现clone()函数
 */

class Resume
{
public:
    Resume(){}
    virtual ~Resume(){}
    virtual Resume *clone(){return 0;}
    virtual void set(char *){}
    virtual void show(){}


protected:
    char *name;
};

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

class ResumeB : public Resume
{
public:
    ResumeB(const char *);
    ResumeB(const ResumeB &);
    ~ResumeB();
    ResumeB *clone();
    void show();
};
#endif // PROTOTYPE_H


Prototype.cpp

#include "prototype.h"
#include <string.h>
#include <iostream>
#include <stdio.h>

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

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

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

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

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


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

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

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

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

void ResumeB::show()
{
    std::cout << "ResumeB name :" << name << std::endl;
}

main.cpp
#include <iostream>

#include "prototype.h"


int main()
{
    Resume *r1 = new ResumeA("A");
    Resume *r2 = new ResumeB("B");
    Resume *r3 = r1->clone();
    Resume *r4 = r2->clone();

    delete r1;
    delete r2;
    r3->show();
    r4->show();


    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值