【C++】工厂模式(一)简单工厂模式

一、介绍

  • 简单工厂模式是一种实例化对象的方式,其专门定义一个类用于创建其他的类,被创建的实例具有同一个基类,使用时只需要输入相应枚举即可创建所需的对象。
  • 在程序中,若需要创建的对象较多,导致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. 具体产品类

具体产品类:CppProgramJaveProgramPythonProgram

// 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;
}

三、优缺点

  • 优点:结构简单,管理方式简单,适合已明确产品数量的场合。
  • 缺点:扩展性差,新增产品时需要修改工厂类。

如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenC++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值