一、介绍
- 简单工厂模式是一种实例化对象的方式,其专门定义一个类用于创建其他的类,被创建的实例具有同一个基类,使用时只需要输入相应枚举即可创建所需的对象。
- 在程序中,若需要创建的对象较多,导致
new
对象时复杂混乱,此时使用简单工厂模式,可以将对象的创建与操作分为两部分,方便后期的维护与管理。
二、简单工厂模式
结构组成:
- 工厂类:工厂模式的核心类,会定义一个用于创建指定的具体实例对象的接口。
- 抽象产品类:是具体产品类的继承的父类或实现的接口。
- 具体产品类:工厂类所创建的对象就是此具体产品实例。
示例:
1. 抽象产品类
抽象产品类(存放一类特征相似的实现,用于定义具体产品类):ProgramBase
// program_base.h
// 编程语言抽象类
#pragma once
#include <iostream>;
class ProgramBase
{
public:
virtual ~ProgramBase() {};
virtual void start();
};
// program_base.cpp
#include "program_base.h"
void ProgramBase::start()
{
std::cout << "Hello world!" << std::endl;
}
2. 具体产品类
具体产品类:CppProgram
、JaveProgram
、PythonProgram
// cpp_program.h
// Cpp类
#pragma once
#include <iostream>;
#include "program_base.h"
class CppProgram : public ProgramBase
{
public:
void start();
};
// cpp_program.cpp
#include "cpp_program.h"
void CppProgram::start()
{
std::cout << "Cpp: Hello world!" << std::endl;
}
// jave_program.h
// Jave类
#pragma once
#include <iostream>;
#include "program_base.h"
class JaveProgram : public ProgramBase
{
public:
void start();
};
// jave_program.cpp
#include "jave_program.h"
void JaveProgram::start()
{
std::cout << "Jave: Hello world!" << std::endl;
}
// python_program.h
// Python类
#pragma once
#include <iostream>;
#include "program_base.h"
class PythonProgram : public ProgramBase
{
public:
void start();
};
// python_program.cpp
#include "python_program.h"
void PythonProgram::start()
{
std::cout << "Python: Hello world!" << std::endl;
}
3. 工厂类
工厂类(工厂类用于统计所有特征,可根据enum
类型创建具体的产品对象):ProgramFactory
//program_factory.h
//工厂类
#pragma once
#include <iostream>
#include "program_base.h"
enum PROGRAM_TYPE
{
CPP = 1,
JAVE,
PYTHON
};
class ProgramFactory
{
public:
virtual ~ProgramFactory() {};
public:
ProgramBase *UseProgram(PROGRAM_TYPE type);
};
//program_factory.cpp
#include <iostream>
#include "program_factory.h"
#include "cpp_program.h"
#include "jave_program.h"
#include "python_program.h"
ProgramBase* ProgramFactory::UseProgram(PROGRAM_TYPE type)
{
switch (type)
{
case CPP:
return new CppProgram();
break;
case JAVE:
return new JaveProgram();
break;
case PYTHON:
return new PythonProgram();
break;
default:
return nullptr;
}
}
4. 使用工厂模式
主函数:先构造工厂对象,后创建指定类型的具体产品对象,并实现其内部的操作。
//main.cpp
#include <iostream>
#include "program_factory.h"
#include "cpp_program.h"
#include "jave_program.h"
#include "python_program.h"
int main()
{
ProgramFactory programFactory;
ProgramBase *cppProgram = programFactory.UseProgram(CPP);
if (cppProgram != NULL)
{
cppProgram->start();
delete cppProgram;
cppProgram = NULL;
}
ProgramBase *javeProgram = programFactory.UseProgram(JAVE);
if (javeProgram != NULL)
{
javeProgram->start();
delete javeProgram;
javeProgram = NULL;
}
ProgramBase *pythonProgram = programFactory.UseProgram(PYTHON);
if (pythonProgram != NULL)
{
pythonProgram->start();
delete pythonProgram;
pythonProgram = NULL;
}
return 0;
}
三、优缺点
- 优点:结构简单,管理方式简单,适合已明确产品数量的场合。
- 缺点:扩展性差,新增产品时需要修改工厂类。