原型模式


//原型模式,用于对象的自我复制

#include<iostream>
#include<string>

using namespace std;

class product
{
public:
	virtual product* my_clone() = 0;
	virtual void print() = 0;
	virtual ~product(){};	//虚析构释放资源
};

class copyer
{
public:
	product* clone(product *obg)
	{
		product* res = obg->my_clone();
		res->print();
		return res;
	}
};

class book :public product
{
public:
	book(string _name, float _price)
	{
		name = _name;
		price = _price;
	}

	virtual product* my_clone()
	{
		book *tmp = new book(name, price);
		return tmp;
	}

	virtual void print()
	{
		cout << "name:" << name << " price:" << price << endl;
	}

	virtual ~book()
	{
		cout << "~book yet\n";
	}

public:
	string name;
	float price;
};

class pen :public product
{
public:
	pen(string _name, float _price, int _num)
	{
		num = _num;
		name = _name;
		price = _price;
	}

	virtual product* my_clone()
	{
		pen *tmp = new pen(name, price,num);
		return tmp;
	}

	virtual void print()
	{
		cout << "name:" << name << " price:" << price << " num:" << num << endl;
	}

	virtual ~pen()
	{
		cout << "~pen yet\n";
	}

public:
	string name;
	float price;
	int num;
};

class deapcopy :public product
{
public:
	deapcopy(char* _buf)
	{
		buf = new char[strlen(_buf) + 1];//妈蛋,中括号!!!小括号表示初始化值,即buf只储存一位!

		memset(buf, 0, strlen(_buf) + 1);

		memcpy(buf, _buf, strlen(_buf) + 1);
	}
	virtual product* my_clone()
	{
		deapcopy *tmp = new deapcopy(buf);
		return tmp;
	}

	virtual void print()
	{
		cout << buf << endl;
	}

	virtual ~deapcopy()
	{
		if (buf != NULL)
		{
			delete buf;
			cout << "~deapcopy yet\n";
			buf == NULL;
		}
	}
public:
	char *buf;
};

void main()
{
	deapcopy b1("heario");
	copyer print1;

	product* b2 = print1.clone(&b1);

	if (((deapcopy*)b2)->buf == b1.buf)
	{
		cout << "not clone";
	}

	delete b2;	//虚析构函数,用父类指针彻底释放资源

	b1.print();

	book b3("slam book",1000);
	product* b4 = print1.clone(&b3);

	delete b4;

	b3.print();

	return;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值