一、工厂模式
工厂模式包括三种:简单工厂模式、工厂方法模式、抽象工厂模式。
工厂模式的主要作用是封装对象的创建,分离对象的创建和操作过程,用于批量管理对象的创建过程,便于程序的维护和扩展。
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++代码)
参考文章:大话设计模式