案例 加减乘除运算
简单工厂模式(Sample Factory Pattern)
简单工厂模式定义
定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
简单工厂模式结构
- 工厂(Factory):根据客户提供的具体产品类的参数,创建具体产品实例
- 抽象产品(Abstract Product):具体产品类的基类,包含创建产品的公共方法
- 具体产品(Concrete Product):抽象产品的派生类,包含具体产品特有的实现方法,是简单工厂模式的创建目标
简单工厂模式示例
https://gitee.com/NiMiKiss/design-pattern.git
#ifndef _SAMPLE_FACTORY_PATTERN_
#define _SAMPLE_FACTORY_PATTERN_
#include <memory>
enum OperationType
{
ADD = 0,
SUB,
MUL,
DIV
};
template <typename T>
class Operation
{
public:
void SetNum1(const T& num1) { m_iNum1 = num1; }
void SetNum2(const T& num2) { m_iNum2 = num2; }
T GetNum1()const { return m_iNum1; }
T GetNum2()const { return m_iNum2; }
virtual T GetResult() = 0;
private:
T m_iNum1;
T m_iNum2;
};
template <typename T>
class OperationAdd :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() + Operation<T>::GetNum2();
}
};
template <typename T>
class OperationSub :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() - Operation<T>::GetNum2();
}
};
template <typename T>
class OperationMul :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() * Operation<T>::GetNum2();
}
};
template <typename T>
class OperationDiv :public Operation<T>
{
public:
T GetResult()
{
if (Operation<T>::GetNum2() != 0)
{
return Operation<T>::GetNum1() / Operation<T>::GetNum2();
}
}
};
template <typename T>
class OperationFactory
{
public:
std::shared_ptr<Operation<T>> CreatOperation(OperationType eOperationType)
{
switch (eOperationType)
{
case ADD:
return std::shared_ptr<OperationAdd<T>>(new OperationAdd<T>());
break;
case SUB:
return std::shared_ptr<OperationSub<T>>(new OperationSub<T>());
break;
case MUL:
return std::shared_ptr<OperationMul<T>>(new OperationMul<T>());
case DIV:
return std::shared_ptr<OperationDiv<T>>(new OperationDiv<T>());
default:
break;
}
}
};
#endif // !_SAMPLE_FACTORY_PATTERN_
客户端调用
#include"Operation.h"
#include<iostream>
int main()
{
auto operationFactory = std::shared_ptr<OperationFactory<int>>(new OperationFactory<int>());
auto operation = operationFactory->CreatOperation(SUB);
operation->SetNum1(1);
operation->SetNum2(3);
std::cout<<operation->GetResult();
return EXIT_SUCCESS;
}
工厂方法模式(Factory Method)
工厂方法模式定义
定义一个用于创建对象的接口,让子类决定用哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类
工厂方法模式结构
- 抽象工厂(AbstractFactory): 所有生产具体产品的工厂类的基类,提供工厂类的公共方法
- 具体工厂(ConcreteFactory):生产具体的产品
- 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法
- 具体产品(ConcreteProduct):具体产品类
工厂方法模式示例
https://gitee.com/NiMiKiss/design-pattern.git
#ifndef _FACTORY_METHOD_PATTERN_
#define _FACTORY_METHOD_PATTERN_
#include <memory>
enum OperationType
{
ADD = 0,
SUB,
MUL,
DIV
};
template <typename T>
class Operation
{
public:
void SetNum1(const T& num1) { m_iNum1 = num1; }
void SetNum2(const T& num2) { m_iNum2 = num2; }
T GetNum1()const { return m_iNum1; }
T GetNum2()const { return m_iNum2; }
virtual T GetResult() = 0;
private:
T m_iNum1;
T m_iNum2;
};
template <typename T>
class OperationAdd :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() + Operation<T>::GetNum2();
}
};
template <typename T>
class OperationSub :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() - Operation<T>::GetNum2();
}
};
template <typename T>
class OperationMul :public Operation<T>
{
public:
T GetResult()
{
return Operation<T>::GetNum1() * Operation<T>::GetNum2();
}
};
template <typename T>
class OperationDiv :public Operation<T>
{
public:
T GetResult()
{
if (Operation<T>::GetNum2() != 0)
{
return Operation<T>::GetNum1() / Operation<T>::GetNum2();
}
}
};
template <typename T>
class OperationFactory
{
public:
virtual std::shared_ptr<Operation<T>> CreatOperation() = 0;
};
template <typename T>
class OperationAddFactory
{
public:
std::shared_ptr<Operation<T>> CreatOperation()
{
return std::shared_ptr<OperationAdd<T>>(new OperationAdd<T>());
}
};
template <typename T>
class OperationSubFactory
{
public:
std::shared_ptr<Operation<T>> CreatOperation()
{
return std::shared_ptr<OperationSub<T>>(new OperationSub<T>());
}
};
template <typename T>
class OperationMulFactory
{
public:
std::shared_ptr<Operation<T>> CreatOperation()
{
return std::shared_ptr<OperationMul<T>>(new OperationMul<T>());
}
};
template <typename T>
class OperationDivFactory
{
public:
std::shared_ptr<Operation<T>> CreatOperation()
{
return std::shared_ptr<OperationDiv<T>>(new OperationDiv<T>());
}
};
#endif // !_FACTORY_METHOD_PATTERN_
客户端调用
#include "Factory_Method_Pattern.h"
#include<iostream>
#include<memory>
int main()
{
auto operationAddFactory = std::shared_ptr<OperationAddFactory<int>>(new OperationAddFactory<int>());
auto operationAdd = operationAddFactory->CreatOperation();
operationAdd->SetNum1(1);
operationAdd->SetNum2(3);
std::cout << operationAdd->GetResult();
return EXIT_SUCCESS;
}
案例 在Access和SQL server分别插入User表和Department表
抽象工厂模式
抽象工厂模式定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
抽象工厂模式结构
- 抽象工厂(AbstractFactory): 所有生产具体产品的工厂类的基类,提供工厂类的公共方法
- 具体工厂(ConcreteFactory):生产具体的产品
- 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法
- 具体产品(ConcreteProduct):具体产品类
抽象工厂模式示例
https://gitee.com/NiMiKiss/design-pattern.git
#ifndef _ABSTRACT_FACTORY_PATTERN
#define _ABSTRACT_FACTORY_PATTERN
#include<iostream>
#include<map>
class User
{
public:
User(const std::string& sName = "", int iID = 0) :m_sName(sName), m_iID(iID) {};
void SetName(const std::string& sName) { m_sName = sName; }
std::string GetName()const { return m_sName; }
void SetId(int iID) { m_iID = iID; }
int GetID()const { return m_iID; }
private:
std::string m_sName;
int m_iID;
};
class IUser
{
public:
virtual void InsertUser(const User& user)
{
std::cout << "Name = " << user.GetName() << " ID= " << user.GetID() << std::endl;
m_mapUser.insert(std::make_pair(user.GetID(), user));
};
virtual void GetUserByID(int iID, User& user)
{
if (m_mapUser.find(iID) != m_mapUser.end())
{
user = m_mapUser[iID];
std::cout << "Name = " << user.GetName() << " ID= " << user.GetID() << std::endl;
}
}
private:
std::map<int, User> m_mapUser;
};
class SqlServerUser :public IUser
{
public:
void InsertUser(const User& user)
{
std::cout << "在SQL Server中给User表增加了一条记录:" << std::endl;
IUser::InsertUser(user);
}
void GetUserByID(int iID, User& user)
{
std::cout << "在SQL Server中根据ID得到User表一条记录" << std::endl;
IUser::GetUserByID(iID, user);
}
};
class AccessUser :public IUser
{
public:
void InsertUser(const User& user)
{
std::cout << "在Access中给User表增加了一条记录" << std::endl;
IUser::InsertUser(user);
}
void GetUserByID(int iID, User& user)
{
std::cout << "在Access中根据ID得到User表一条记录" << std::endl;
IUser::GetUserByID(iID, user);
}
};
class Department
{
public:
Department(const std::string& sName = "", int iID = 0) :m_sName(sName), m_iID(iID) {};
void SetName(const std::string& sName) { m_sName = sName; }
std::string GetName()const { return m_sName; }
void SetId(int iID) { m_iID = iID; }
int GetID()const { return m_iID; }
private:
std::string m_sName;
int m_iID;
};
class IDepartment
{
public:
virtual void InsertDepartment(const Department& department)
{
std::cout << "Name = " << department.GetName() << " ID= " << department.GetID() << std::endl;
m_mapDepartment.insert(std::make_pair(department.GetID(), department));
};
virtual void GetDepartmentByID(int iID, Department& department)
{
if (m_mapDepartment.find(iID) != m_mapDepartment.end())
{
department = m_mapDepartment[iID];
std::cout << "Name = " << department.GetName() << " ID= " << department.GetID() << std::endl;
}
}
private:
std::map<int, Department> m_mapDepartment;
};
class SqlServerDepartment :public IDepartment
{
public:
void InsertDepartment(const Department& department)
{
std::cout << "在SQL Server中给Department表增加了一条记录:" << std::endl;
IDepartment::InsertDepartment(department);
}
void GetDepartmentByID(int iID, Department& department)
{
std::cout << "在SQL Server中根据ID得到Department表一条记录" << std::endl;
IDepartment::GetDepartmentByID(iID, department);
}
};
class AccessDepartment :public IDepartment
{
public:
void InsertDepartment(const Department& department)
{
std::cout << "在Access中给Department表增加了一条记录" << std::endl;
IDepartment::InsertDepartment(department);
}
void GetDepartmentByID(int iID, Department& department)
{
std::cout << "在Access中根据ID得到Department表一条记录" << std::endl;
IDepartment::GetDepartmentByID(iID, department);
}
};
class Factory
{
public:
virtual std::shared_ptr<IUser> CreatUser() = 0;
virtual std::shared_ptr<IDepartment> CreatDepartment() = 0;
};
class SqlServerFactory :public Factory
{
public:
std::shared_ptr<IUser> CreatUser()
{
return std::shared_ptr<SqlServerUser>(new SqlServerUser());
}
std::shared_ptr<IDepartment> CreatDepartment()
{
return std::shared_ptr<SqlServerDepartment>(new SqlServerDepartment());
}
};
class AccessFactory :public Factory
{
public:
std::shared_ptr<IUser> CreatUser()
{
return std::shared_ptr<AccessUser>(new AccessUser());
}
std::shared_ptr<IDepartment> CreatDepartment()
{
return std::shared_ptr<AccessDepartment>(new AccessDepartment());
}
};
#endif // !_ABSTRACT_FACTORY_PATTERN
客户端调用
#include "Abstract_Factory_Pattern.h"
#include<memory>
#include<iostream>
void TestAccessUser()
{
auto spAccessFactory = std::shared_ptr<AccessFactory>(new AccessFactory());
auto spAccessUser = spAccessFactory->CreatUser();
spAccessUser->InsertUser(User("小白", 1));
User userGet;
spAccessUser->GetUserByID(1, userGet);
std::cout << "客户端获取:ID= " << userGet.GetID() << " Name=" << userGet.GetName() << std::endl;
}
void TestSqlServerUser()
{
auto spSqlServerFactory = std::shared_ptr<SqlServerFactory>(new SqlServerFactory());
auto spSqlServerUser = spSqlServerFactory->CreatUser();
spSqlServerUser->InsertUser(User("小白", 1));
User userGet;
spSqlServerUser->GetUserByID(1, userGet);
std::cout << "客户端获取:ID= " << userGet.GetID() << " Name=" << userGet.GetName() << std::endl;
}
void TestAccessDepartment()
{
auto spAccessFactory = std::shared_ptr<AccessFactory>(new AccessFactory());
auto spAccessDepartment = spAccessFactory->CreatDepartment();
spAccessDepartment->InsertDepartment(Department("小白", 1));
Department departmentGet;
spAccessDepartment->GetDepartmentByID(1, departmentGet);
std::cout << "客户端获取:ID= " << departmentGet.GetID() << " Name=" << departmentGet.GetName() << std::endl;
}
void TestSqlServerDepartment()
{
auto spSqlServerFactory = std::shared_ptr<SqlServerFactory>(new SqlServerFactory());
auto spSqlServerDepartment = spSqlServerFactory->CreatDepartment();
spSqlServerDepartment->InsertDepartment(Department("小白", 1));
Department departmentGet;
spSqlServerDepartment->GetDepartmentByID(1, departmentGet);
std::cout << "客户端获取:ID= " << departmentGet.GetID() << " Name=" << departmentGet.GetName() << std::endl;
}
int main()
{
TestAccessUser();
TestSqlServerUser();
TestAccessDepartment();
TestSqlServerDepartment();
return EXIT_SUCCESS;
}