码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式--原型模式(创建型)

时间:2016-12-28 12:21:03      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:创建对象   父类   strlen   one   模式   粘贴   需要   技术   set   

一、原型模式

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式实现的关键就是实现Clone函数,还需要实现深拷贝。

二、UML类图

技术分享

三、例子

//父类
class Resume
{
protected:
    char *name;
public:
    Resume() {}
    virtual ~Resume() {}
    virtual Resume* Clone() { return NULL; }
    virtual void Set(char *n) {}
    virtual void Show() {}
};

class ResumeA : public Resume
{
public:
    ResumeA(const char *str);  //构造函数
    ResumeA(const ResumeA &r); //拷贝构造函数
    ~ResumeA();                //析构函数
    ResumeA* Clone();          //克隆,关键所在
    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::Show() {
    cout<<"ResumeA name : "<<name<<endl; 
}

int main()
{
    Resume *r1 = new ResumeA("A");
    Resume *r2 = new ResumeB("B");
    Resume *r3 = r1->Clone();
    Resume *r4 = r2->Clone();
    r1->Show(); r2->Show();
    //删除r1,r2
    delete r1; delete r2;    
    r1 = r2 = NULL;
    //深拷贝所以对r3,r4无影响
    r3->Show(); r4->Show();
    delete r3; delete r4;
    r3 = r4 = NULL;
}

三、原型模式的优点及适用场景

使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。(性能提升?需要研究)

使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

设计模式--原型模式(创建型)

标签:创建对象   父类   strlen   one   模式   粘贴   需要   技术   set   

原文地址:http://www.cnblogs.com/justkong/p/6228632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!