C++工厂设计模式

一、工厂模式

工厂模式包括三种:简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式的主要作用是封装对象的创建,分离对象的创建和操作过程,用于批量管理对象的创建过程,便于程序的维护和扩展。

1.简单工厂模式

核心思想:是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的 virtual 函数得到不同的结果,只抽象产品,不抽象工厂

#include "stdafx.h"
#include <iostream>
using namespace std;

//计算基类
class Operation
{
public:
	double numberA, numberB;
	virtual double GetResult() = 0;
};

//加法
class AddOperaion : public Operation
{
	double GetResult() override
	{
		return numberA + numberB;
	}
};

//减法
class SubOperation : public Operation
{
	double GetResult() override
	{
		return numberA - numberB;
	}
};

//乘法
class MulOperation : public Operation
{
	double GetResult() override
	{
		return numberA - numberB;
	}
};

//除法
class DivOperation : public Operation
{
	double GetResult() override
	{
		return numberA / numberB;
	}
};

//工厂类
class OperFactory
{
public:
	static Operation * CreateOperation(char c)
	{
		switch (c)
		{
		case '+':
			return new AddOperaion;
		case '-':
			return new SubOperation;
		case '*':
			return new MulOperation;
		case '/':
			return new DivOperation;
		default:
			break;
		}
	}
};

int main(void)
{
	Operation *oper = OperFactory::CreateOperation('+');
	oper->numberA = 100;
	oper->numberB = 55;
	cout << oper->GetResult() << endl;
	return 0;
}
2.工厂方法模式

核心思想:不仅抽象产品,也抽象工厂,每一种产品都有专属对应的一个工厂

#include <iostream>
using namespace std;

//计算基类
class Operation
{
public:
	double numberA, numberB;
	virtual double GetResult() = 0;
};

//加法
class AddOperaion : public Operation
{
	double GetResult() override
	{
		return numberA + numberB;
	}
};

//减法
class SubOperation : public Operation
{
	double GetResult() override
	{
		return numberA - numberB;
	}
};

//乘法
class MulOperation : public Operation
{
	double GetResult() override
	{
		return numberA - numberB;
	}
};

//除法
class DivOperation : public Operation
{
	double GetResult() override
	{
		return numberA / numberB;
	}
};

//工厂抽象类
class IFactory
{
protected:
	virtual Operation *CreateOperation() = 0;
};

//加法工厂
class AddFactory : public IFactory
{
public:
	static Operation *CreateOperation()
	{
		return new AddOperaion;
	}
};

//减法工厂
class SubFactory : public IFactory
{
public:
	static Operation *CreateOperation()
	{
		return new SubOperation;
	}
};

//乘法工厂
class MulFactory : public IFactory
{
public:
	static Operation *CreateOperation()
	{
		return new MulOperation;
	}
};

//除法工厂
class DivFactory : public IFactory
{
public:
	static Operation *CreateOperation()
	{
		return new DivOperation;
	}
};

int main(void)
{
	//计算加法
	Operation *oper = AddFactory::CreateOperation();
	oper->numberA = 100;
	oper->numberB = 55;
	cout << oper->GetResult() << endl;
	return 0;
}
3.抽象工厂模式

核心思想:与工厂方法类似,但是每个工厂可生产一个产品族(工厂方法算是一种极限情况下的抽象工厂,一个产品族下只有一个产品)

#include <iostream>
using namespace std;

//用户基类(产品1基类)
class IUser
{
public:
	virtual void GetUser() = 0;
	virtual void SetUser() = 0;
};

class SqlUser : public IUser
{
public:
	void GetUser()
	{
		cout << "在Sql中返回user" << endl;
	}
	void SetUser()
	{
		cout << "在Sql中设置user" << endl;
	}
};

class AccessUser : public IUser
{
public:
	void GetUser()
	{
		cout << "在Access中返回user" << endl;
	}
	void SetUser() 
	{
		cout << "在Access中设置user" << endl;
	}
};

//部门基类(产品2基类)
class IDepartment
{
public:
	virtual void GetDepartment() = 0;
	virtual void SetDepartment() = 0;
};

class SqlDepartment : public IDepartment
{
public:
	void GetDepartment()
	{
		cout << "在Sql中返回Department" << endl;
	}
	void SetDepartment()
	{
		cout << "在Sql中设置Department" << endl;
	}
};

class AccessDepartment : public IDepartment
{
public:
	void GetDepartment()
	{
		cout << "在Access中返回Department" << endl;
	}
	void SetDepartment()
	{
		cout << "在Access中设置Department" << endl;
	}
};

//工厂基类
class IFactory
{
public:
	virtual IUser *CreateUser() = 0;
	virtual IDepartment *CreateDepartment() = 0;
};

//sql工厂,生成 sqlUser 和 sqlDepartment
class SqlFactory : public IFactory
{
public:
	IUser *CreateUser()
	{
		return new SqlUser();
	}
	IDepartment *CreateDepartment()
	{
		return new SqlDepartment();
	}
};

//Access工厂 生产AccessUser 和AccessDepartment
class AccessFactory : public IFactory
{
public:
	IUser *CreateUser()
	{
		return new AccessUser();
	}
	IDepartment *CreateDepartment()
	{
		return new AccessDepartment();
	}
};

int main()
{
	IFactory *ptrFactory = new AccessFactory();
	IUser *ptrUser = ptrFactory->CreateUser();
	IDepartment *ptrDepartment = ptrFactory->CreateDepartment();

	ptrUser->GetUser();
	ptrUser->SetUser();
	ptrDepartment->GetDepartment();
	ptrDepartment->SetDepartment();

	return 0;
}

参考博客:几种常见的设计模式(含C++代码)
参考文章:大话设计模式

猜你喜欢

转载自blog.csdn.net/weixin_38739598/article/details/107375407
今日推荐