设计模式——抽象工厂

使用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,会打印不同的信息。

说明:与工厂模式非常类似,只有接口多了几个,而且要求接口完全一致,这是它的优点同时也是它的缺点。抽象工厂这个名字起的并不好,应该叫工厂簇模式。
 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值