原型模式及C++代码实现

     理论学习:

      原型模式:

      原型模式提供的是自我复制的功能,就是说新对象的创建可以通过已有的对象进行创建!这里的原型其实本身就是“对象工厂”,因为它能够生产对象,在原型模式中新的对象都是对原型的一份拷贝!从自身复制自己创建新的对象。
      原型模式的优点:
      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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值