//原型模式,用于对象的自我复制
#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;
}
原型模式
最新推荐文章于 2022-12-05 10:54:59 发布