Qt C++ 工厂模式

产品类:

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();
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值