15 大话设计模式C++实现之抽象工厂模式
/*
抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
*/
/*
实例:不同客户的数据库管理采用不同的数据库完成,不同的数据库在语法上存在差异,因此需要
解除用户和具体数据库之间的耦合(即业务逻辑与数据访问的解耦),避免向不同类型的客户提供支持时的代码复用
*/
#include<iostream>
#include<string>
using namespace std;
//IDepartment接口,用于客户端访问,解除与具体数据库的访问的耦合
class IDepartment
{
public:
virtual void Insert(IDepartment* department) = 0;
virtual IDepartment* GetDepartment(int id) = 0;
};
//SqlseverDepartment类,用于访问SQL sever的Department
class SqlServerDepartment : public IDepartment
{
public:
virtual void Insert(IDepartment* department)
{
cout << "在SQL Server中给Department增加一条记录" << endl;
}
IDepartment* GetDepartment(int id)
{
cout << "在SQL Server中根据ID得到的Department记录" << endl;
return NULL;
}
};
//AccessDepartment类,用于访问Access的Department
class AccessDepartment : public IDepartment
{
public:
virtual void Insert(IDepartment* department)
{
cout << "在Access中给Department表增加一条记录" << endl;
}
virtual IDepartment* GetDepartment(int id)
{
cout << "在Access中根据ID得到Department表一条记录" << endl;
return NULL;
}
};
//IUer接口,用于客户端访问,解除与具体数据库访问的耦合
class IUser
{
public:
virtual void Insert(IUser* user) = 0;
virtual IUser* GetUser(int id) = 0;
};
class SqlseverUser : public IUser
{
public:
virtual void Insert(IUser* user)
{
cout << "在SQL中给User增加一条记录!" << endl;
}
virtual IUser* GetUser(int id)
{
IUser *sq = new SqlseverUser;
return sq;
}
};
class AccessUser : public IUser
{
public:
AccessUser()
{
cout << "AccessUser构造函数" << endl;
}
virtual void Insert(IUser* user)
{
cout << "在ACESS中给User增加一条记录!" << endl;
}
virtual IUser* GetUser(int id)
{
cout << "在ACESS中根据ID得到一条user表记录" << endl;
IUser *sa = new AccessUser;
return sa;
}
};
//定义工厂类接口
//工厂方法模式是定义一个用于创建对象的接口,让子类决定具体实例化哪一个对象,可以利用父类指针指向子类对象
class IFactory
{
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
};
class SqlseverFactory : public IFactory
{
public:
virtual IUser* CreateUser()
{
return new SqlseverUser;
}
virtual IDepartment* CreateDepartment()
{
return new SqlServerDepartment;
}
};
class AccessFactory : public IFactory
{
public:
AccessFactory()
{
cout << "创建accessfactory对象" << endl;
}
virtual IUser* CreateUser()
{
cout << "创建AccessUser对象" << endl;
return new AccessUser;
}
virtual IDepartment* CreateDepartment()
{
cout << "创建AccessDepartment对象" << endl;
return new AccessDepartment;
}
};
void Client()
{
IUser *user = NULL;
IDepartment * dept = NULL;
IFactory *fac = new AccessFactory();
IUser *iu = fac->CreateUser(); //iu指向accessuser对象
iu->Insert(user);
iu->GetUser(1);
IDepartment *id = fac->CreateDepartment();
id->Insert(dept);
id->GetDepartment(1);
if (iu != NULL)
{
free(iu);
iu = NULL;
}
if (fac != NULL)
{
free(fac);
fac = NULL;
}
}
int main()
{
Client();
system("pause");
return 0;
}