C++重写《大话设计模式》中模式实例三(抽象工厂模式)
(声明:如果想看实例详细解析,请看《大话设计模式》,这里文章只是为了加深学习设计模式印象而自己用C++程序写一遍,以及把代码共享给大家。仅仅是把C#语言换成C++表述,不对书中的程序和例子是否合适做个人表述。)
可以把抽象工厂模式和简单工厂模式、工厂模式做对比。抽象工厂模式可以在抽象工厂类中抽象出一个个的抽象产品族,就像IUser和IDepartment就是一个抽象产品族,而SqlseverUser等就是具体的抽象产品。在简单工厂模式和工厂模式里面,管理的只是一个个抽象产品,而不是抽象产品族。
简单工厂模式:https://blog.****.net/qq_34784043/article/details/82925158
工厂模式:https://blog.****.net/qq_34784043/article/details/82926652
UML图:
User.h
#pragma once
#include <iostream>
#include <string>
class User {
private:
int _id;
std::string name;
public:
void SetID(int id) { _id = id; }
int GetID() { return _id; }
void SetName(std::string name) { this->name = name; }
std::string GetName() { return name; }
};
IUser.h
#pragma once
#include "User.h"
class IUser {
public:
virtual void Insert(User* user) = 0;
virtual User* GetUser(int id) = 0;
};
class SqlserverUser :public IUser {
public:
virtual void Insert(User* user) {
std::cout << "在SQL Server 中给User表增加一条记录" << std::endl;
}
virtual User* GetUser(int id) {
std::cout << "在SQL Server中根据ID得到User表的一条记录" << std::endl;
return NULL;
}
};
class AccessUser :public IUser {
public:
virtual void Insert(User* user) {
std::cout << "在Access中给User表增加一条记录" << std::endl;
}
virtual User* GetUser(int id) {
std::cout << "在Access中根据ID得到User表一条记录" << std::endl;
return NULL;
}
};
Department.h
#pragma once
#include <iostream>
#include <string>
class Department {
private:
int _id;
std::string deptName;
public:
void SetID(int id) { _id = id; }
int GetID() { return _id; }
void SetDeptName(std::string deptName) { this->deptName = deptName; }
std::string GetDeptName() { return deptName; }
};
IDepartment.h:
#pragma once
#include "Department.h"
class IDepartment {
public:
virtual void Insert(Department* department) = 0;
virtual Department* GetDepartment(int id) = 0;
};
class SqlserverDepartment :public IDepartment{
public:
virtual void Insert(Department* department) {
std::cout << "在SQL Sever中给Department表增加一条记录" << std::endl;
}
virtual Department* GetDepartment(int id) {
std::cout << "在SQL Server中根据ID得到Department表一条记录" << std::endl;
return NULL;
}
};
class AccessDepartment :public IDepartment {
public:
virtual void Insert(Department* department) {
std::cout << "在Access中给Department表增加一条记录" << std::endl;
}
virtual Department* GetDepartment(int id) {
std::cout << "在Access中根据ID得到Department表一条记录" << std::endl;
return NULL;
}
};
IFactory.h
#pragma once
#include "IUser.h"
#include "IDepartment.h"
class IFactory {
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
};
class SqlServerFactory :public IFactory {
public:
virtual IUser* CreateUser() {
return new SqlserverUser();
}
virtual IDepartment* CreateDepartment() {
return new SqlserverDepartment();
}
};
class AccessFactory :public IFactory {
public:
virtual IUser* CreateUser(){
return new AccessUser();
}
virtual IDepartment* CreateDepartment() {
return new AccessDepartment();
}
};
main.cpp
#include "IFactory.h"
#include <cstdlib>
int main() {
//IFactory* factory = new SqlServerFactory();//选择使用SqlServer数据库
IFactory* factory = new AccessFactory();//选择和初始化Access数据库
User *user = new User();//创建用户表
IUser* iu = factory->CreateUser();
iu->Insert(user);
iu->GetUser(1);
Department *dept = new Department();//创建部门表
IDepartment *id = factory->CreateDepartment();
id->Insert(dept);
id->GetDepartment(1);
delete dept;
delete iu;
delete user;
delete factory;
system("pause");
return 0;
}
运行结果: