Qt C++ 工厂模式

来源:互联网 发布:关于大学生网络的论文 编辑:程序博客网 时间:2024/06/05 10:54

产品类:

project.h

#pragma once


#include <QDebug>


class CProject
{
public:
virtual void show() = 0;
};


class CProjectA : public CProject
{
public:
CProjectA();
void show()
{
qDebug() << "A is me";
}
};


class CProjectB : public CProject
{
public:
CProjectB();
void show()
{
qDebug() << "B is me";
}
};


class CProjectSingle
{
public:
CProjectSingle();
};


class CProjectMulti
{
public:
CProjectMulti();
};


class CProjectSingleA : public CProjectSingle
{
public:
CProjectSingleA();
};


class CProjectSingleB : public CProjectSingle
{
public:
CProjectSingleB();
};


class CProjectMultiA : public CProjectMulti
{
public:
CProjectMultiA();
};


class CProjectMultiB : public CProjectMulti
{
public:
CProjectMultiB();
};

project.cpp

#include "project.h"


CProjectA::CProjectA()
{
qDebug() << "this is a A";
}


CProjectB::CProjectB()
{
qDebug() << "this is a B";
}


CProjectSingle::CProjectSingle()
{
qDebug() << "this is a Single";
}


CProjectMulti::CProjectMulti()
{
qDebug() << "this is a Multi";
}


CProjectSingleA::CProjectSingleA()
{
qDebug() << "this is a SingleA";
}


CProjectSingleB::CProjectSingleB()
{
qDebug() << "this is a SingleB";
}


CProjectMultiA::CProjectMultiA()
{
qDebug() << "this is a MultiA";
}


CProjectMultiB::CProjectMultiB()
{
qDebug() << "this is a MultiB";
}

简单工厂:

simplefactory.h

#pragma once


#include "project.h"


class CSimpleFactory
{
public:
static CSimpleFactory* instance();
enum EProjectType
{
eprojectA,
eprojectB,
};
CProject* createProject(EProjectType type);

protected:
CSimpleFactory(){}
};


simplefactory.cpp

#include "simplefactory.h"


CSimpleFactory* CSimpleFactory::instance()
{
static CSimpleFactory* _instance=0;
if (!_instance)
{
_instance = new CSimpleFactory;
}
return _instance;
}


CProject* CSimpleFactory::createProject(EProjectType type)
{
switch(type)
{
case eprojectA:
return new CProjectA();
case eprojectB:
return new CProjectB();
default:
return 0;
}
}

工厂方法:

factorymethod.h

#pragma once


#include "project.h"


class CFactoryMethod
{
public:
virtual CProject* createProject() = 0;
};


class CFactoryMethodA : public CFactoryMethod
{
public:
static CFactoryMethod* instance();


CProject* createProject();


protected:
CFactoryMethodA(){};
};


class CFactoryMethodB : public CFactoryMethod
{
public:
static CFactoryMethod* instance();


CProject* createProject();


protected:
CFactoryMethodB(){};
};

factorymethod.cpp



#include "factorymethod.h"


CFactoryMethod* CFactoryMethodA::instance()
{
static CFactoryMethod* _instance = 0;
if (!_instance)
{
_instance = new CFactoryMethodA;
}
return _instance;
}


CProject* CFactoryMethodA::createProject()
{
return new CProjectA;
}


CFactoryMethod* CFactoryMethodB::instance()
{
static CFactoryMethod* _instance = 0;
if (!_instance)
{
_instance = new CFactoryMethodB;
}
return _instance;
}


CProject* CFactoryMethodB::createProject()
{
return new CProjectB;
}

抽象工厂:

abstractfactory.h

#pragma once


#include "project.h"


class CAbstractFactory
{
public:
virtual CProjectSingle* createSingle() = 0;
virtual CProjectMulti* createMulti() = 0;
};


class CFactoryA : public CAbstractFactory
{
public:
CFactoryA(){}
CProjectSingle* createSingle();
CProjectMulti* createMulti();
};


class CFactoryB : public CAbstractFactory
{
public:
CFactoryB(){}
CProjectSingle* createSingle();
CProjectMulti* createMulti();
};

abstractfactory.cpp

#include "abstractfactory.h"


CProjectSingle* CFactoryA::createSingle()
{
return new CProjectSingleA();
}


CProjectMulti* CFactoryA::createMulti()
{
return new CProjectMultiA();
}


CProjectSingle* CFactoryB::createSingle()
{
return new CProjectSingleB();
}


CProjectMulti* CFactoryB::createMulti()
{
return new CProjectMultiB();
}


main.cpp

#include <QApplication>


#include "abstractfactory.h"
#include "factorymethod.h"
#include "simplefactory.h"


int main(int argc,char **argv)
{
QApplication app(argc,argv);


//简单工厂
CProject *a = CSimpleFactory::instance()->createProject(CSimpleFactory::eprojectA);
CProject *b = CSimpleFactory::instance()->createProject(CSimpleFactory::eprojectB);
//工厂方法
CProject *aa = CFactoryMethodA::instance()->createProject();
CProject *bb = CFactoryMethodB::instance()->createProject();
//抽象工厂
CAbstractFactory *facA = new CFactoryA();
CProjectSingle *single1 = facA->createSingle();
CProjectMulti *mul1 = facA->createMulti();


CAbstractFactory *facB = new CFactoryB();
CProjectSingle *single2 = facB->createSingle();
CProjectMulti *mul2 = facB->createMulti();

return app.exec();
}


原创粉丝点击