使用QT,新建QWidget工程。
widget.h如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
namespace Ui {
class Widget;
}
class SplitterInterface { // 抽象类
public:
virtual void split()=0;
virtual ~SplitterInterface();
};
class SplitterFactory { // 抽象工厂
public:
virtual SplitterInterface* createsplitter()=0;
virtual ~SplitterFactory();
};
class BinarySplitter : public SplitterInterface { // 具体类
public:
virtual void split();
virtual ~BinarySplitter();
};
class TxtSplitter : public SplitterInterface { // 具体类
public:
virtual void split();
virtual ~TxtSplitter();
};
class BinarySplitterFactory : public SplitterFactory { // 具体工厂
public:
virtual SplitterInterface* createsplitter();
virtual ~BinarySplitterFactory();
};
class TxtSplitterFactory : public SplitterFactory { // 具体工厂
public:
virtual SplitterInterface* createsplitter();
virtual ~TxtSplitterFactory();
};
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(SplitterFactory* factory,QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
SplitterFactory* m_splitterFactory;
};
#endif // WIDGET_H
widget.cpp如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(SplitterFactory* factory,QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
m_splitterFactory = factory;
ui->setupUi(this);
}
Widget::~Widget() {
delete ui;
}
void Widget::on_pushButton_clicked() {
SplitterInterface * splitter = m_splitterFactory->createsplitter();
splitter->split();
}
SplitterInterface::~SplitterInterface() { }
SplitterFactory::~SplitterFactory() { }
void BinarySplitter::split() {
qDebug()<<"BinarySplitter split()";
}
BinarySplitter::~BinarySplitter() { }
void TxtSplitter::split() {
qDebug()<<"TxtSplitter split()";
}
TxtSplitter::~TxtSplitter() { }
SplitterInterface *BinarySplitterFactory::createsplitter() {
return new BinarySplitter;
}
BinarySplitterFactory::~BinarySplitterFactory() { }
SplitterInterface *TxtSplitterFactory::createsplitter() {
return new TxtSplitter;
}
TxtSplitterFactory::~TxtSplitterFactory() { }
main.cpp如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[]){
QApplication a(argc, argv);
BinarySplitterFactory *binarySplitterFactory = new BinarySplitterFactory;
TxtSplitterFactory *txtSplitterFactory = new TxtSplitterFactory;
Widget w1(binarySplitterFactory);
w1.show();
Widget w2(txtSplitterFactory);
w2.show();
return a.exec();
}
widget.ui如下:
运行结果如下:
产生两个Widget窗口,分别点击PushButton,会打印不同的信息。
说明:文件分割器需要支持二进制文件和文本文件的分割。支持不同的文件类型是一种变化。如果直接在Widget中new 一个新类的话,就可能要反复去修改这个类。这里使用工厂方法,把要new的类放到Widget外面。把要变化的东西“赶出去”。这里的new也称为“多态new”。