使用QT,新建QWidget工程。
widget.h如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
namespace Ui {
class Widget;
}
class DbConnectInterface { // 抽象类
};
class DbCommandInterface {
};
class DbDataReaderInterface {
};
class DbFactoryInterface {
public:
virtual DbConnectInterface* createDbConnect() = 0;
virtual DbCommandInterface* createDbCommand() = 0;
virtual DbDataReaderInterface* createDbDataReader() = 0;
virtual ~DbFactoryInterface();
};
class SqliteDbConnect : public DbConnectInterface {
};
class SqliteDbCommand : public DbCommandInterface {
};
class SqliteDbDataReader : public DbDataReaderInterface {
};
class SqliteDbFactory : public DbFactoryInterface{
public:
virtual DbConnectInterface* createDbConnect();
virtual DbCommandInterface* createDbCommand();
virtual DbDataReaderInterface* createDbDataReader();
virtual ~SqliteDbFactory();
};
class OracleDbConnect : public DbConnectInterface {
};
class OracleDbCommand : public DbCommandInterface {
};
class OracleDbDataReader : public DbDataReaderInterface {
};
class OracleDbFactory : public DbFactoryInterface{
public:
virtual DbConnectInterface* createDbConnect();
virtual DbCommandInterface* createDbCommand();
virtual DbDataReaderInterface* createDbDataReader();
virtual ~OracleDbFactory();
};
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(DbFactoryInterface* factory,QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
DbFactoryInterface* m_factory;
};
#endif // WIDGET_H
widget.cpp如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(DbFactoryInterface* factory,QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
m_factory = factory;
ui->setupUi(this);
}
Widget::~Widget() {
delete ui;
}
void Widget::on_pushButton_clicked() {
DbConnectInterface* dbConnect = m_factory->createDbConnect();
DbCommandInterface* dbCommand = m_factory->createDbCommand();
DbDataReaderInterface* dbDataReader = m_factory->createDbDataReader();
}
DbFactoryInterface::~DbFactoryInterface() { }
DbConnectInterface *SqliteDbFactory::createDbConnect() {
qDebug()<<"SqliteDbFactory createDbConnect";
return new SqliteDbConnect;
}
DbCommandInterface *SqliteDbFactory::createDbCommand() {
qDebug()<<"SqliteDbFactory createDbCommand";
return new SqliteDbCommand;
}
DbDataReaderInterface *SqliteDbFactory::createDbDataReader() {
qDebug()<<"SqliteDbFactory createDbDataReader";
return new SqliteDbDataReader;
}
SqliteDbFactory::~SqliteDbFactory() { }
DbConnectInterface *OracleDbFactory::createDbConnect() {
qDebug()<<"OracleDbFactory createDbConnect";
return new OracleDbConnect;
}
DbCommandInterface *OracleDbFactory::createDbCommand() {
qDebug()<<"OracleDbFactory createDbCommand";
return new OracleDbCommand;
}
DbDataReaderInterface *OracleDbFactory::createDbDataReader() {
qDebug()<<"OracleDbFactory createDbDataReader";
return new OracleDbDataReader;
}
OracleDbFactory::~OracleDbFactory() { }
main.cpp如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DbFactoryInterface *sqliteDbFactory = new SqliteDbFactory;
Widget w1(sqliteDbFactory);
w1.show();
DbFactoryInterface *oracleDbFactory = new OracleDbFactory;
Widget w2(oracleDbFactory);
w2.show();
return a.exec();
}
widget.ui如下:
运行结果如下:
产生两个Widget窗口,分别点击PushButton,会打印不同的信息。
说明:与工厂模式非常类似,只有接口多了几个,而且要求接口完全一致,这是它的优点同时也是它的缺点。抽象工厂这个名字起的并不好,应该叫工厂簇模式。