理论学习:
原型模式:
原型模式提供的是自我复制的功能,就是说新对象的创建可以通过已有的对象进行创建!这里的原型其实本身就是“对象工厂”,因为它能够生产对象,在原型模式中新的对象都是对原型的一份拷贝!从自身复制自己创建新的对象。原型模式的优点:
1.向客户隐藏制造新实例的复杂性。比如,下面我自己写的这个例子,在客户端代码main函数中,客户要制造一个新的对象时,客户只需调用名为Clone函数即可,客户完全不用知道这个对象是如何产生的,也不用知道产生这个对象的过程的复杂性!
2.复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可!
实例分析:
下面是我自己写的一个实例,算是对原型模式的一种实践! 现在有两个人要去找工作,一个叫张三的毕业生和一个叫马君的在校生。现在每个人都要把简历投到多个司,那么就需要多分简历,那是不是每份自己相同的简历都要自己写呢? 当然不是! 我们现在有种叫打印机的高科技设备啊!我们两个每个人只需要手写一份,然后以此为“原型”利用打印机打印出其他份即可! 假如现在张三同学的简历有点问题需要更改,那么只需要更改他手写的那份“原型”即可,然后再用打印机打印出其他的份就OK啦!
2014.4.15晚上
#include<iostream>
#include<string>
using namespace std;
class Resume
{
public:
virtual Resume*Clone() = 0;//纯虚函数,功能实现由其子类承担
virtual void display() = 0;
};
class Graduate_Resume :public Resume
{
public:
Graduate_Resume(string name, int age, string native_place, string graduate_school)
{//定义构造函数,由于函数形参与类的数据成员名字相同,故对于数据成员应该用this指针显式指出
this->name = name;
this->age = age;
this->native_place = native_place;
this->graduate_school = graduate_school;
}
virtual void display()
{//定义虚函数在本类中实现的功能
cout <<endl<<"毕业生"<< name << "的简历:" << endl;
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "籍贯:" << native_place << endl;
cout << "毕业院校:" << graduate_school << endl;
}
virtual Resume*Clone()
{//定义虚函数在本类中实现的功能,返回一个拷贝的实例化对象
return new Graduate_Resume(this->name, this->age, this->native_place, this->graduate_school);
}
private:
string name;
int age;
string native_place;
string graduate_school;
};
class In_school_Resume :public Resume
{
public:
In_school_Resume(string name, string school, string major)
{//定义构造函数,由于函数形参与类的数据成员名字相同,故对于数据成员应该用this指针显式指出
this->name = name;
this->school = school;
this->major = major;
}
virtual void display()
{//定义虚函数在本类中实现的功能
cout << endl << "在校生" << name << "的简历" << endl;
cout << "姓名:" << name << endl;
cout << "在读学校:" << school << endl;
cout << "主修专业:" << major << endl;
}
virtual Resume*Clone()
{//定义虚函数在本类中实现的功能,返回一个拷贝的实例化对象
return new In_school_Resume(this->name, this->school, this->major);
}
private:
string name;
string school;
string major;
};
int main(void)
{
Resume*obj1 = new Graduate_Resume("张三", 24, "湖南省长沙市", "中南大学");
Resume*obj2 = obj1->Clone(); //复制原型获得新对象
Resume*obj3 = obj2->Clone();//复制原型获得新对象
Resume*obj4 = obj3->Clone();//复制原型获得新对象
obj1->display();
obj2->display();
obj3->display();
obj4->display();
Resume*obj5 = new In_school_Resume("马君", "湖南大学", "机械制造及其自动化(信息化方向)");
Resume*obj6 = obj5->Clone();
Resume*obj7 = obj6->Clone();
Resume*obj8 = obj7->Clone();
obj5->display();
obj6->display();
obj7->display();
obj8->display();
delete obj1;
delete obj2;
delete obj3;
delete obj4;
delete obj5;
delete obj6;
delete obj7;
delete obj8;
system("pause");
return 0;
}