设计模式——工厂方法

使用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”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值