Qt下实现简单工厂设计模式

简述

简单工厂设计模式是一种基础简单而常用的设计模式,对理解封装、继承和多态特性有非常大的帮助。下面就来在Qt下实现简单工厂模式。

代码之路

实现简单工厂至少需要四个类。其中最主要的两个类是工厂类和一个基类,另外的类都是这个基类的继承类。下面的例子中工厂类是factory,基类是BasicClass,两个继承类分别是ClassA和ClassB。
基类BasicClass的实现如下

//basicclass.h
#include <QObject>
#include <QDebug>
class BasicClass : public QObject
{
    Q_OBJECT
  public:
  BasicClass();
  ~BasicClass();

  virtual void showClassName();
};

//basicclass.cpp
#include "basicclass.h"
BasicClass::BasicClass()
{
}
BasicClass::~BasicClass()
{
}
void BasicClass::showClassName()
{
  qDebug() << "这是一个基类!";
}

继承类ClassA如下:

//classA.h
#include "basicclass.h"
class ClassA : public BasicClass
{
    Q_OBJECT
public:
    ClassA();

    void showClassName();
};

//classA.cpp
#include "classa.h"
ClassA::ClassA()
{
}
void ClassA::showClassName()
{
    qDebug() << "这个类是ClassA!";
}

继承类classB如下:

//classB.h
#include "basicclass.h"
class ClassB : public BasicClass
{
     Q_OBJECT
public:
    ClassB();
    void showClassName();
};

//classB.cpp
#include "classb.h"
ClassB::ClassB()
{
}
void ClassB::showClassName()
{
    qDebug() << "这个类是ClassB";
}

工厂类factory如下:

//factory.h
#include "classa.h"
#include "classb.h"
enum ClassType{ ATYPE, BTYPE};
class factory
{
public:
    factory();

    static BasicClass* createNewClass(ClassType kind);
};

//factory.cpp
#include "factory.h"

factory::factory()
{

}

//factory.cpp
BasicClass *factory::createNewClass(ClassType kind)
{
    BasicClass* tmpClass = NULL;
    switch(kind)
    {
    case ATYPE:
        tmpClass = new ClassA();
        break;
    case BTYPE:
        tmpClass = new ClassB();
        break;
    default:
        break;
    }
    return tmpClass;
}

如何使用简单工厂模式:

//头文件
#include "factory.h"

//源文件
BasicClass* m_classA = factory::createNewClass(ATYPE);
BasicClass* m_classB = factory::createNewClass(BTYPE);

m_classA->showClassName();
m_classB->showClassName();

//输出结果
这个类是ClassA!
这个类是ClassB

UML类图

在这里插入图片描述

小结

简单工厂模式就是工厂根据传入的条件不同返回不同的产品,如果要扩展产品则需修改工厂类,增加新产品即可;但如果要扩展已有产品的功能,则需要修改基类,违背了开放封闭原则,从而有了抽象工厂模式。复杂程度大大提升,这里就不做介绍了。

猜你喜欢

转载自blog.csdn.net/lusanshui/article/details/84643613