抽象工厂模式
最基本的数据访问程序
“你先写一段你原来的数据库访问的做法给我看看。”“那就用‘新增用户’和‘得到用户’为例吧。”
#include <stdio.h>
class User
{
public:
int id;
char* name;
};
class SqlserverUser
{
public:
void Insert(User* user)
{
printf("在SQL Server中给User表添加一条记录 ");
}
User* GetUser(int id)
{
printf("在SQL Server中根据ID得到User表一条记录 ");
return 0;
}
};
int main()
{
User* user = new User();
SqlserverUser* su = new SqlserverUser();
su->Insert(user);
su->GetUser(1);
delete user;
delete su;
return 0;
}
“我最开始就是这样写的,非常简单。”
“这里之所以不能换数据库,原因就在于SqlserverUser* su = new SqlserverUser();使得su这个对象被框死在SQL Server上了。如果这里是灵活的,专业点的说法,是多态的,那么在执行‘su->Insert(user);’和‘su->GetUser(1);’时就不用考虑是在用SQL Server还是在用Access了。”
用工厂方法模式的数据访问程序
#include <stdio.h>
class User
{
public:
int id;
char* name;
};
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)
{
printf("在SQL Server中给User表添加一条记录 ");
}
virtual User* GetUser(int id)
{
printf("在SQL Server中根据ID得到User表一条记录 ");
return 0;
}
};
class AccessUser : public IUser
{
public:
virtual void Insert(User* user)
{
printf("在Access中给User表添加一条记录 ");
}
virtual User* GetUser(int id)
{
printf("在Access中根据ID得到User表一条记录 ");
return 0;
}
};
class IFactory
{
public:
virtual IUser* CreateUser()=0;
};
class SqlServerFactory : public IFactory
{
public:
virtual IUser* CreateUser()
{
return new SqlserverUser();
}
};
class AccessFactory : public IFactory
{
public:
virtual IUser* CreateUser()
{
return new AccessUser();
}
};
int main()
{
User* user = new User();
IFactory* factory = new SqlServerFactory();
IUser* iu = factory->CreateUser();
iu->Insert(user);
iu->GetUser(1);
delete user;
delete factory;
delete iu;
return 0;
}
“非常好。现在如果要换数据库,只需要把new SqlServerFactory()改成new AccessFactory(),此时由于多态的关系,使得声明IUser接口的对象iu实现根本不知道是在访问哪个数据库,却可以在运行时很好的完成工作,这就是所谓的业务逻辑与数据访问的解耦。”
“但是,大鸟,这样写,代码里还是有指明‘new SqlServerFactory()’呀,我要改的地方,依然很多。”
“这个先不急,待会再说,问题没有完全解决,你的数据库里不可能只有一个User表吧,很可能有其他表,比如增加部门表(Department表),此时如何办呢?”
抽象工厂模式
客户类和工厂类分开。消费者任何时候需要某套产品集合时,只需向抽象工厂请求即可。抽象工厂会再向具体的工厂生产出符合产品集规格的产品。实现方式(UML类图)
实现代码
#include <stdio.h>
class User
{
public:
int id;
char* name;
};
class Department
{
public:
int id;
char* deptname;
};
// User表接口
class IUser
{
public:
virtual void Insert(User* user)=0;
virtual User* GetUser(int id)=0;
};
// Department表接口
class IDepartment
{
public:
virtual void Insert(Department* department)=0;
virtual Department* GetDepartment(int id)=0;
};
class SqlserverUser : public IUser
{
public:
virtual void Insert(User* user)
{
printf("在SQL Server中给User表添加一条记录 ");
}
virtual User* GetUser(int id)
&
补充:Web开发 , ASP.Net ,