原型模式
类似于工厂模式,将工厂模式中的抽象工厂类和具体工厂类合并。适用于复杂对象,即需要调用拷贝构造函数,而工厂模式对于复杂的函数对象实现麻烦。简单的对象创建就可以直接用工厂。看代码:
#pragma once
#include<iostream>
using namespace std;
class ISplitter {
public:
virtual void split() = 0;
virtual ISplitter* clone() = 0;//克隆自己来创建对象
virtual ~ISplitter() {}
};
class BinarySplitter :public ISplitter {
public:
void split() override {
cout << "BinarySplitter" << endl;
}
ISplitter* clone() override{
return new BinarySplitter(*this);//调用拷贝构造函数
}
};
class TxtSplitter :public ISplitter {
public:
void split() override {
cout << "TxtSplitter" << endl;
}
ISplitter* clone() override {
return new TxtSplitter(*this);
}
};
以解析数据为例,抽象基类是数据分割,子类可以是文本数据、二进制数据等。
#include<iostream>
#include"prototype.h"
using namespace std;
class mainForm {
public:
mainForm(ISplitter* prototype) {
this->prototype = prototype;
}
void Button_Click() {
ISplitter* splitter = prototype->clone();//克隆原型
splitter->split();
}
private:
ISplitter* prototype;//原型对象
};
int main()
{
mainForm* form1 = new mainForm(new BinarySplitter());
form1->Button_Click();
mainForm* form2 = new mainForm(new TxtSplitter());
form2->Button_Click();
return 0;
}
实验结果如下: