简述
简单工厂设计模式是一种基础简单而常用的设计模式,对理解封装、继承和多态特性有非常大的帮助。下面就来在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类图
小结
简单工厂模式就是工厂根据传入的条件不同返回不同的产品,如果要扩展产品则需修改工厂类,增加新产品即可;但如果要扩展已有产品的功能,则需要修改基类,违背了开放封闭原则,从而有了抽象工厂模式。复杂程度大大提升,这里就不做介绍了。